【发布时间】:2021-05-28 06:21:45
【问题描述】:
我目前在 Prisma 工作并尝试使用原始 sql 查询进行排序,但我无法做到这一点。我对字段名称和排序顺序都使用变量,我还想包含 IN 语句以缩短代码量(没有多个 WHEN 语句)和 ELSE 语句作为默认值:
const users = await prisma.$queryRaw<User[]>(
`
SELECT * FROM "Users"
ORDER BY
CASE WHEN $1 IN ('name','surname') THEN $1 ELSE 'id' END
CASE WHEN $2 IN ('ASC','DESC') THEN $2 ELSE 'ASC' END
`,
sort?.fieldName || 'name',
sort?.order || 'ASC'
)
执行这行代码时出现此错误:
"code": "P2010",
"clientVersion": "2.17.0",
"meta": {
"code": "42601",
"message": "db error: ERROR: syntax error at or near \"CASE\""
},
"stacktrace": [
"Error: ",
"Invalid `prisma.queryRaw()` invocation:",
"",
"",
" Raw query failed. Code: `42601`. Message: `db error: ERROR: syntax error at or near \"CASE\"`",
" at cb (/app/node_modules/@prisma/client/runtime/index.js:78689:17)",
" at processTicksAndRejections (internal/process/task_queues.js:93:5)"
],
"message": "\nInvalid `prisma.queryRaw()` invocation:\n\n\n Raw query failed. Code: `42601`. Message: `db error: ERROR: syntax error at or near \"CASE\"`",
我试图通过在很多变体中大量组合逗号、括号来实现这一点,但充其量算法只是不排序记录。
我也直接在数据库上执行了类似的命令(没有参数但具有实际值)但结果相同。
编辑 1
我为测试目的准备了 SQL 查询,但没有参数(我不知道如何在原始 SQL 中使用它)。
SELECT * FROM "Users"
ORDER BY
CASE WHEN 'name' IN ('name','surname') THEN 'name' ELSE 'id' END,
CASE WHEN 'DESC' IN ('ASC','DESC') THEN 'DESC' ELSE 'ASC' END
以上代码执行正常,但排序仍然不正确。
【问题讨论】:
-
第二个 case 表达式前需要一个逗号。
-
所以你的意思是 -
THEN $1 ELSE 'id' END, .....? -
它正在正确执行,但是当我将“名称”传递给排序字段时,它仍然按 id 排序。所以看起来像查询选择 ELSE 语句。
-
请检索正在执行的有效 SQL 并将其添加到问题中。您的代码可能产生了错误的 SQL 查询。
-
我已将 SQL 查询添加到问题中
标签: sql postgresql prisma