跳到主要內容

比較使用原始查詢來比較相同表格的欄位

比較來自相同表格的不同欄位是開發人員經常遇到的情境。一些範例包括比較相同表格中的兩個數值,或比較相同表格中的兩個日期。有一個關於相同的現有 GitHub 議題

警告

從 4.3.0 版本開始,您不需要使用原始查詢來比較相同表格中的欄位。您可以使用 <model>.fields 屬性來比較欄位

以下資訊保留用於與 4.3.0 之前的 Prisma ORM 版本向後相容。

變通方法

比較來自相同表格中兩個欄位的值可以使用原始查詢來達成。

比較數值

資訊

從 4.3.0 版本開始,您不需要使用原始查詢來比較相同表格中的欄位。您可以使用 <model>.fields 屬性來比較欄位。了解更多

比較來自不同欄位的值的一個使用案例是檢索評論數多於讚數的貼文;在這種情況下,您需要比較 commentsCountlikesCount 的值。

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()

執行上述查詢將提取 completedDatedueDate 之後的專案。

查詢回應

;[
{
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',
},
]