ORDER BY 跨越 Postgres 中的多个列 SQL

ORDER BY across multiple columns in Postgres SQL

作为示例,让我们考虑以下 Table players 在 Postgres SQL 数据库中

name            username*        score*
--------------------------------------
Jack Daniels    PerfectJack      100
-               JohnDoe          20
-               MadMike          500
Ben Tailor      Tailor3d         10

(* = required)

我想查询table并输出如下(伪代码)

SELECT (ISSET name ? name : username, score) 
FROM players 
ORDER BY (ISSET name ? name : username)

结果应该是

player         score
--------------------
Ben Tailor     10
Jack Daniels   100
JohnDoe        20
MadMike        500

为了澄清:让我们假设一个网络应用程序,用户使用用户名注册。他也可以输入他的真实姓名,但不是必须的。当显示玩家列表时,网络应用程序应该能够输出真实姓名(如果设置)并回退到用户名(如果未设置姓名)并在这两列之间进行排序(即,如果可用于订购,则使用真实姓名,否则使用用户名)。

如何使用 Postgres SQL 语句实现此行为?

这应该可以解决问题:

SELECT case when name is not null then name else username end player, score
FROM players 
ORDER BY case when name is not null then name else username end

这可以使用 COALESCE:

SELECT 
    COALESCE(name, username) AS player, 
    score 
FROM 
    players 
ORDER BY 
    COALESCE(name, username);

此外,避免在您的对象中使用保留字 - 例如 "name"。