使用原生查詢比較同一表中的列
比較同一表中的不同列是開發者經常遇到的常見場景。一些示例包括比較同一表中的兩個數值或比較同一表中的兩個日期。關於此問題,有一個現有的 GitHub Issue。
警告
從 4.3.0 版本開始,您不再需要使用原生查詢來比較同一表中的列。您可以使用 <model>.fields 屬性來比較這些列。
以下資訊保留用於向後相容 4.3.0 之前的 Prisma ORM 版本。
變通方案
透過使用原生查詢,可以實現比較同一表中兩列的值。
比較數值
資訊
從 4.3.0 版本開始,您不再需要使用原生查詢來比較同一表中的列。您可以使用 <model>.fields 屬性來比較這些列。瞭解更多
比較不同列值的一個用例是檢索評論數多於點贊數的帖子;在這種情況下,您需要比較 commentsCount 和 likesCount 的值。
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
likesCount Int
commentsCount Int
}
查詢(取決於資料庫)可能類似於
PostgreSQL / CockroachDB
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function initiateNumbersComparisonRawQuery() {
const response =
await prisma.$queryRaw`SELECT * FROM "public"."Post" WHERE "likesCount" < "commentsCount";`
console.log(response)
}
await initiateNumbersComparisonRawQuery()
MySQL
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function initiateNumbersComparisonRawQuery() {
const response =
await prisma.$queryRaw`SELECT * FROM \`public\`.\`Post\` WHERE \`likesCount\` < \`commentsCount\`;`
console.log(response)
}
await initiateNumbersComparisonRawQuery()
SQLite
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function initiateNumbersComparisonRawQuery() {
const response =
await prisma.$queryRaw`SELECT * FROM "Post" WHERE "likesCount" < "commentsCount";`
console.log(response)
}
await initiateNumbersComparisonRawQuery()
執行上述查詢(取決於資料庫)將篩選出點贊數少於評論數的帖子。
查詢響應
;[
{
id: 1,
createdAt: '2022-03-03T12:08:11.421+00:00',
updatedAt: '2022-03-03T12:08:11.422+00:00',
title: 'Hello World',
content: 'This is my first post',
published: false,
authorId: 1,
likesCount: 50,
commentsCount: 100,
},
]
比較日期值
資訊
從 4.3.0 版本開始,您不再需要使用原生查詢來比較同一表中的列。您可以使用 <model>.fields 屬性來比較這些列。瞭解更多
類似地,如果您需要比較日期,也可以使用原生查詢實現同樣的效果。
例如,一個用例可能是獲取所有在截止日期之後完成的專案。
model Project {
id Int @id @default(autoincrement())
title String
author User @relation(fields: [authorId], references: [id])
authorId Int
dueDate DateTime
completedDate DateTime
createdAt DateTime @default(now())
}
查詢(取決於資料庫)可能類似於
PostgreSQL / CockroachDB
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function initiateDatesComparisonRawQuery() {
const response =
await prisma.$queryRaw`SELECT * FROM "public"."Project" WHERE "completedDate" > "dueDate";`
console.log(response)
}
await initiateDatesComparisonRawQuery()
MySQL
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function initiateDatesComparisonRawQuery() {
const response =
await prisma.$queryRaw`SELECT * FROM \`public\`.\`Project\` WHERE \`completedDate\` > \`dueDate\`;`
console.log(response)
}
await initiateDatesComparisonRawQuery()
SQLite
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function initiateDatesComparisonRawQuery() {
const response =
await prisma.$queryRaw`SELECT * FROM "Project" WHERE "completedDate" > "dueDate";`
console.log(response)
}
await initiateDatesComparisonRawQuery()
執行上述查詢將獲取 completedDate 在 dueDate 之後的所有專案。
查詢響應
;[
{
id: 1,
title: 'Project 1',
authorId: 1,
dueDate: '2022-03-10T00:00:00+00:00',
completedDate: '2022-03-12T00:00:00+00:00',
createdAt: '2022-03-03T12:08:11.421+00:00',
},
]