PostgreSQL 中`ORDER BY`的第二个键有`CASE`

问题描述 投票:0回答:2

在 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

sql postgresql postgresql-16
2个回答
1
投票

如果......否则......结束,则不能使用

DESC
ASC

这是 ORDER BY 部分:ORDER BY DESC。

尝试使用任何

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

小提琴


-1
投票

您不能在 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 表达式的其余部分。

© www.soinside.com 2019 - 2024. All rights reserved.