PostgreSQL中ORDER BY用标量子查询为何不生效且无报错?
问题解析:PostgreSQL中
ORDER BY (SELECT 1)无排序效果的原因 先拆解几个相关的ORDER BY行为:
ORDER BY 1是按结果集第1列的取值排序,这里对应表中_列的整数,所以能正常实现排序效果。ORDER BY 'error, of course'报错,是因为PostgreSQL要求用整数常量指定列的位置索引,字符串常量不符合这个规则,因此抛出"non-integer constant in ORDER BY"错误。
关于ORDER BY (SELECT 1)的两个核心问题
为什么不报错?
标量子查询(SELECT 1)返回单个整数常量值,PostgreSQL允许用任意可比较的表达式作为排序依据,整数显然满足要求,因此不会触发错误。为什么没有排序效果?
这个标量子查询返回的是固定值1,结果集中每一行的排序键都是1。当所有行的排序键完全相同时,PostgreSQL会保留数据的原始存储/默认返回顺序,不会执行任何实际的排序操作——没有可区分的排序依据,自然看不出排序变化。
如果把标量子查询改成返回动态值的形式,比如(SELECT random()),就能看到排序效果了,因为每一行的排序键不再一致。
测试表创建语句:
CREATE TABLE Teest (_ INTEGER); INSERT INTO Teest VALUES (1), (3), (5), (2), (4), (6);
内容的提问来源于stack exchange,提问作者shynur
相关产品推荐
相关产品推荐

