由于大多数(如果不是全部)SQL 的实现在省略时ASC
默认在子句中使用该关键字。ORDER BY
关键字是否有有效的用例ASC
?
我不是在寻求心理原因、意见、良好实践、可读性或围绕 SQL 编造的任何可以从一个人的角度改变到另一个人的观点的东西。
由于大多数(如果不是全部)SQL 的实现在省略时ASC
默认在子句中使用该关键字。ORDER BY
关键字是否有有效的用例ASC
?
我不是在寻求心理原因、意见、良好实践、可读性或围绕 SQL 编造的任何可以从一个人的角度改变到另一个人的观点的东西。
我正在更新一个报告工具实现,以便它查询 BigQuery 而不是 PostgreSQL。PostgreSQL 数据在 BigQuery 中提取。一项要求是报告结果在此更新后保持完全相同,即报告查询在 BigQuery 上运行时应输出与在 PostgreSQL 上完全相同的结果。
特别是,我需要 BigQuery 以与我的 PostgreSQL 服务器当前相同的方式对字符串进行排序。不能更改我的 PostgreSQL 服务器对字符串的排序方式。
例如,使用此表:
姓名 | ID |
---|---|
活动 | 1 |
活动 | 2 |
活动 | 3 |
富 | 4 |
和查询
SELECT name FROM table ORDER BY name, id
我的 PostgreSQL 返回
活动, 活动, 活动, foo
而 BigQuery 返回
活动,活动,活动,foo
我试过了
SELECT name FROM table ORDER BY NORMALIZE_AND_CASEFOLD(name), id
但 BigQuery 会返回
活动, 活动, 活动, foo
根据标准 SQL UNION
/UNION ALL
不保证任何特定的排序顺序没有外部ORDER BY
子句 - 就像 SQL 中几乎没有任何地方可以保证排序顺序没有ORDER BY
.
但是,Postgres 对 的普通情况使用“追加”步骤UNION ALL
,因此第一条腿的结果(即使在它们的分区中未排序)总是在下一条腿之前,等等。Postgres 只是按照给定的顺序附加来自每条腿的结果。这与一个LIMIT
子句特别相关:
SELECT 1 FROM tbl -- or any complex query
UNION ALL
SELECT 2
LIMIT 1
显然,这不适用于UNION
(没有ALL
)。但除此之外,我从未见过 Postgres 乱序返回,即上述查询中的“2”SELECT
,而第一个也会返回行。即使第一站非常昂贵,也不是。
我过去曾基于此行为的查询。现在我遇到了一个说法,Postgres 可能会在这里返回乱序的行,但没有得到实际证据的证实。
当前的Postgres 手册对此事有这样的说法:
UNION
有效地将结果附加到query2
结果query1
(尽管不能保证这是实际返回行的顺序)。此外,它从结果中消除重复行,与使用 , 的方式DISTINCT
相同UNION ALL
。
这很不清楚。引用的顺序是否适用于SELECT
子句列表,或每个子句中的行,还是仅适用于返回的集合?此外,UNION ALL
仅在第二句中提及,因此尚不清楚最重要的第一句是否应该适用于UNION ALL
...
任何人都可以举一个例子,其中行被乱序返回,破坏了UNION ALL
子句的顺序?在任何版本的 Postgres 中。(即使最新版本最有趣。)
如果不是这样,是否有理由相信这可能会在未来的版本中发生变化?
ORDER BY
不是这里的直接问题。问题是多个UNION ALL
子句是否返回给定序列中的行(之前LIMIT
可以启动并阻止进一步的分支执行)。
我有一个包含 200000 行的数据库。在这 200000 行中,我想要最新的 25000,而我需要最旧的 id(列 entity_id)。
到目前为止,这是我的查询:select * from sales_flat_order order by entity_id desc limit 25000;
这已经永远运行了。有没有更好的办法?也许在位置 25000 上获取 entity_id 更容易,但必须订购,我需要在最新条目的位置 25000 上拥有 id。
这是表的创建语句:https ://pastebin.com/mrY7CTP8
谢谢!
在以下脚本中(请参阅此处的完整演示):
SELECT *
FROM Table1
ORDER BY
CASE WHEN Field1 IS NOT NULL
THEN 0
END
0
什么?0
解释的?不是选择列表中列的序号,因为选择列表枚举是从 1 开始的,而不是 0。那么它是什么?为了详细说明,将上面的代码段与以下代码段进行比较,它会发出错误:
SELECT *
FROM Table1
ORDER BY 0
ORDER BY 位置编号 0 超出了选择列表中的项目数范围。
并将其与以下代码段进行比较,该代码段会发出另一个错误:
SELECT *
FROM Table1
ORDER BY '0'
在 ORDER BY 列表的位置 1 中遇到常量表达式。
似乎将0
值嵌套在case
子句下使它起作用,但我不明白为什么以及如何?
我正在尝试学习和理解排序规则以及 postgresql 如何比较和排序字符串,但我发现不协调,我不知道我错过了什么。
查询:
SELECT datname, datcollate FROM pg_database;
返回我的所有数据库都使用 en_GB.UTF-8 排序规则。
和查询:
SELECT table_schema,
table_name,
column_name,
collation_name
FROM information_schema.columns
WHERE collation_name is not null
ORDER BY table_schema,
table_name,
ordinal_position;
返回所有列都有“C”排序规则,这意味着(根据我的研究)没有指定排序规则。所以,我假设使用了数据库排序规则,不是吗?
编辑:我的错误在这里。上一个查询不会为所有列返回结果,仅对那些collation_name
不为空的列返回结果,具有空排序规则的列是继承数据库排序规则的列。所以我认为 foo.bar 列有C
排序规则,但null
实际上是。
好吧,当我运行查询时出现了不一致:
SELECT "name" FROM foo.bar ORDER BY "name" ASC;
其中“名称”列数据类型是文本,而 foo.bar 是用户创建的 schema.table 组合。结果它就像人类一样按字母顺序排列。从 a/A 到 Z/z,不管是大写还是小写。
但是,如果我运行以下查询:
SELECT "table_name"
FROM information_schema.tables
WHERE
"table_name" ~ 'some_pattern'
AND table_schema = 'foo'
AND table_type = 'BASE TABLE'
ORDER BY "table_name" ASC;
它以类似机器的方式对结果进行排序,逐字节比较,因此在小写之前排序大写。
为什么会有这种差异?我已经看到“table_name”列数据类型不是“文本”而是“名称”,但我找不到它是否有事可做。
将数据库排序规则设置为 en_GB.UTF-8 不足以以人类的方式比较文本?
谢谢你的时间。
给定 Postgres 中的表,例如
CREATE TABLE t1 (
type text NOT NULL,
value int NOT NULL
)
where type
could be A
, B
or C
and 给定一个任意的重复模式,比如
A B B C B B
如何查询表,以便结果首先根据模式排序,然后根据值排序?换句话说,第一行是A
最低value
的,第二行是B
最低value
的,第三行是B
第二低的value
,依此类推。如果我们用完了特定的类型,我们就继续前进到模式中的下一个字母(即,如果我们没有更多C
的 s 要返回,模式就变成ABBBB
)。
类型 | 价值 |
---|---|
一个 | 1 |
乙 | 1 |
乙 | 2 |
C | 1 |
乙 | 3 |
乙 | 4 |
一个 | 2 |
乙 | 5 |
乙 | 6 |
乙 | 7 |
乙 | 8 |
一个 | 3 |
乙 | 9 |
实际模式是动态的并且具有任意长度,认为它总是被限制为只有type
.
这是一个样本数据的小提琴。
让我们考虑一下我有一张桌子:
CREATE TABLE student (
id int,
name varchar(128)
);
INSERT INTO student (id,name) VALUES
(1,'John'),
(2,'Bob'),
(3,'Alice'),
(4,'Don'),
(5,'Eve');
我需要“名称”列与下一个交换位置:1 与 2、3 与 4 等,但保持“id”的顺序。选择的输出应该是这样的:
id names
1 | Bob
2 | John
3 | Don
4 | Alice
5 | Eve
有没有一种有效的方法来编写可以给我预期结果的查询?
我有一个具有这种嵌套结构的 SQL 表:
CREATE TABLE items (`id` INTEGER, `item_name` VARCHAR(6), `parent_id` INTEGER, `list_order` INTEGER);
我的 SQLite 版本不支持窗口函数,目前我在链接SQLite 查询中的查询返回结果如下,但它不是根据 list_order 排序的,另一个细节是 list_order 列可能所有值都为零。
id name_item parent_id level path_index list_order
---------------------------------------------------------------
1 Pois 0 0 1 4
2 Então 0 0 2 5
3 Teste 0 0 3 3
11 Teste 3 3 1 3.1 2
12 Teste 2 3 1 3.2 0
13 Teste 1 3 1 3.3 1
4 Fundo 0 0 4 2
7 Profundo 4 1 4.1 1
8 Dhdhd 4 1 4.2 0
9 Gagagaga 8 2 4.2.1 1
10 Fsfsfsfs 8 2 4.2.2 0
5 Profundo 0 0 5 1
6 Gigante 0 0 6 6
14 Teste 0 0 7 0
我希望 path_index 列遵循 list_order 和 level 列,如下所示:
id name_item parent_id level path_index list_order
---------------------------------------------------------------
14 Teste 0 0 1 0
5 Profundo 0 0 2 1
4 Fundo 0 0 3 2
8 Dhdhd 4 1 3.1 0
10 Fsfsfsfs 8 2 3.1.1 0
9 Gagagaga 8 2 3.1.2 1
7 Profundo 4 1 3.2 1
3 Teste 0 0 4 3
12 Teste 2 3 1 4.1 0
13 Teste 1 3 1 4.2 1
11 Teste 3 3 1 4.3 2
1 Pois 0 0 5 4
2 Então 0 0 6 5
6 Gigante 0 0 7 6
如何对齐根据 list_order 和 level 列排序的 path_index?