SELECT * FROM Teest ORDER BY 1; -- OK if you're using PostgreSQL
SELECT * FROM Teest ORDER BY 'error, of course';
ERROR: non-integer constant in ORDER BY
字符串
所以我想知道是否可以在ORDER BY
中使用 * 标量子查询 *:
SELECT * FROM Teest ORDER BY (SELECT 1);
型
然而,结果是**ORDER BY (SELECT 1)
不起作用**(即,结果没有排序)。它也没有抛出错误。
为什么?为什么?不是整数吗?但是如果我写ORDER BY (SELECT 1)
,PostgreSQL不会抛出错误;这表明PostgreSQL知道ORDER BY
后面是一个整数。(否则,它将给予如上所示的错误消息。)
创建表格Teest
:
CREATE TABLE Teest (_ INTEGER);
INSERT INTO Teest VALUES (1), (3), (5), (2), (4), (6);
型
PostgreSQL v16
1条答案
按热度按时间mhd8tkvw1#
ORDER BY
子句中的整数具有特殊含义:每个
***expression***
可以是输出列(SELECT
列表项)的名称或序号,也可以是由输入列值形成的任意表达式。这就是为什么它被区别于字符串常量。错误警告你按常量排序没有任何意义。如果你说
ORDER BY 1
,这并不意味着“按常量排序”(无操作),而是“按第一列排序”。SQL-92标准只允许
ORDER BY
子句中的列别名和整数。PostgreSQL通过允许几乎任意的表达式来扩展它。子查询(SELECT 1)
没有扁平化,所以PostgreSQL不知道它实际上是一个整数常量。