跳至主要内容

比较同一张表中的列,使用原生查询

比较同一张表中的不同列是一个常见的开发场景。一些例子包括比较同一张表中的两个数值,或者比较同一张表中的两个日期。有一个已有的 GitHub Issue 也提到了这个问题。

警告

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

运行上述查询将获取 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',
},
]