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"。
作为示例,让我们考虑以下 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"。