在 PostgreSQL 中,我尝试使用按多列排序的 SQL。第一列始终是
priority DESC NULLS LAST
。第二个需要根据某些条件是动态的(为了方便举例,这里我有WHEN 1 = 1
)。
SELECT id, title, priority
FROM post
ORDER BY
priority DESC NULLS LAST,
CASE WHEN 1 = 1 THEN created_at ASC ELSE created_at DESC END;
这会引发错误:
“ASC”处或附近的语法错误。 第 5 行:当 1 = 1 时则创建_at ASC 否则创建_at ...
我怎样才能在
CASE
的第二个键上有ORDER BY
?
如果......否则......结束,则不能使用
DESC
或ASC
。尝试使用任何
anchor
日期 - 整数值的日期差异。
SELECT id, title, priority
FROM post
ORDER BY
priority DESC NULLS LAST,
CASE WHEN 1 = 1 THEN created_at-'2025-01-01'::date -- ASC
ELSE '2025-01-01'::date-created_at END; -- DESC
或者将日期转换为bigint并使用符号(+/-)
SELECT id, title, priority
FROM post
ORDER BY
priority DESC NULLS LAST,
CASE WHEN 1 = 1 THEN EXTRACT(EPOCH FROM created_at) -- ASC
ELSE -EXTRACT(EPOCH FROM created_at) END; -- DESC
您不能在 CASE 语句中直接使用 ASC 或 DESC,同样的内容在下面的堆栈溢出帖子中也有描述
具有 DES/Asc 排序的 Order By 子句的 Case 语句
相反,您可以执行以下操作
SELECT id, title, priority, created_at
FROM post
ORDER BY
priority DESC NULLS LAST,
CASE
WHEN 1 = 1 THEN created_at
ELSE NULL -- Or provide a default value if needed
END ASC
PostgreSQL CASE 语句用于根据条件返回一个值。它不是为处理 ASC 或 DESC 等修饰符而设计的。
参考:
https://www.postgresql.org/docs/current/functions-conditional.html
只要表达式有效,就可以使用 CASE 子句。每个条件都是一个返回布尔结果的表达式。如果条件的结果为真,则 CASE 表达式的值是条件后面的结果,并且不处理 CASE 表达式的其余部分。