跳到主要内容

ORDER BY 子句

ORDER BY 是输出修饰子。从逻辑上讲,它在查询接近末尾时应用(如果存在,位于 LIMITOFFSET 之前)。 ORDER BY 子句会按排序条件对行进行升序或降序排序。 此外,每个排序项都可以指定将 NULL 值放在开头还是末尾。

ORDER BY 子句可以包含一个或多个表达式,使用逗号分隔。 如果没有任何表达式会报错,因为这种情况下应移除 ORDER BY 子句。 表达式可以以任意标量表达式(可以是列名)、列位置编号(从 1 开始)或关键字 ALL 开头。 每个表达式后可选排序修饰符(ASCDESC,默认 ASC),以及/或者 NULL 排序修饰符(NULLS FIRSTNULLS LAST,默认 NULLS LAST)。

ORDER BY ALL

ALL 关键字表示输出应按所有列从左到右依次排序。 该排序方向可通过 ORDER BY ALL ASCORDER BY ALL DESC 调整,也可配合 NULLS FIRSTNULLS LAST。 请注意,ALL 不能与 ORDER BY 子句中的其他表达式混用,必须单独使用。 请参见下面的示例。

NULL 排序修饰符

默认情况下,Goose 使用 ASCNULLS LAST,即值按升序排列,NULL 值排在最后。 这与 PostgreSQL 的默认排序行为一致。 可通过以下配置项更改默认排序行为。

使用 default_null_order 选项可将默认 NULL 排序方式改为 NULLS_FIRSTNULLS_LASTNULLS_FIRST_ON_ASC_LAST_ON_DESCNULLS_LAST_ON_ASC_FIRST_ON_DESC

SET default_null_order = 'NULLS_FIRST';

使用 default_order 可将默认排序方向改为 DESCASC

SET default_order = 'DESC';

排序规则

文本默认使用二进制比较排序规则,这意味着按 UTF-8 二进制值进行排序。 这种方式对 ASCII 文本(例如英文数据)通常效果很好,但对其他语言可能不正确。 为此,Goose 提供了排序规则(collation)。 更多信息请参见排序规则页面

示例

以下示例都使用这张示例表:

CREATE OR REPLACE TABLE addresses AS
SELECT '123 Quack Blvd' AS address, 'DuckTown' AS city, '11111' AS zip
UNION ALL
SELECT '111 Duck Duck Goose Ln', 'DuckTown', '11111'
UNION ALL
SELECT '111 Duck Duck Goose Ln', 'Duck Town', '11111'
UNION ALL
SELECT '111 Duck Duck Goose Ln', 'Duck Town', '11111-0001';

查询地址,按城市名排序,使用默认排序方向和默认 NULL 顺序:

SELECT *
FROM addresses
ORDER BY city;

查询地址,按城市名降序排序,并将空值放在末尾:

SELECT *
FROM addresses
ORDER BY city DESC NULLS LAST;

先按城市再按邮编排序,均使用默认排序方式:

SELECT *
FROM addresses
ORDER BY city, zip;

按城市排序,并使用德语排序规则:

SELECT *
FROM addresses
ORDER BY city COLLATE DE;

ORDER BY ALL 示例

按从左到右(先地址、再城市、再邮编)升序排序:

SELECT *
FROM addresses
ORDER BY ALL;
addresscityzip
111 Duck Duck Goose LnDuck Town11111
111 Duck Duck Goose LnDuck Town11111-0001
111 Duck Duck Goose LnDuckTown11111
123 Quack BlvdDuckTown11111

按从左到右(先地址、再城市、再邮编)降序排序:

SELECT *
FROM addresses
ORDER BY ALL DESC;
addresscityzip
123 Quack BlvdDuckTown11111
111 Duck Duck Goose LnDuckTown11111
111 Duck Duck Goose LnDuck Town11111-0001
111 Duck Duck Goose LnDuck Town11111

语法