鉴于此:
CREATE TABLE test (
a int,
b varchar(255)
);
INSERT INTO test VALUES(1, '100');
INSERT INTO test VALUES(1, '50');
INSERT INTO test VALUES(1, '075');
INSERT INTO test VALUES(1, '+50');
INSERT INTO test VALUES(1, '-50');
SELECT a, b AS c
FROM test AS t
ORDER BY t.a, c;
SELECT a, b AS c
FROM test AS t
ORDER BY t.a, t.b::int;
SELECT a, b AS c
FROM test AS t
ORDER BY t.a, c::int;
最后一个查询返回错误:
错误:列“c”不存在:从测试 AS t 中选择 a、b AS c ORDER BY t.a、c::int
我想订购由列别名给出的结果。
如果我还想转换由别名给出的特定列,则它不起作用。
ORDER BY alias
有效而 ORDER BY alias::int
无效的原因是什么?
是否有另一种方法可以在强制转换中使用列别名?
最佳答案
这是一个很长的评论。
Here是对此问题的早期引用,我引用其中:
ORDER BY
(and alsoGROUP BY
) permit references to output column names only when they are unadorned. You cannot use them in expressions.
如果我必须推测其原因,那就与表达式求值有关。我认为 Postgres 引擎逻辑上将您的查询重写为:
SELECT a, b AS c, c::int as INVISIBLEUNSEENCOLUMN
FROM test AS t
ORDER BY t.a, INVISIBLEUNSEENCOLUMN;
也就是说,它将表达式移动到通常评估表达式的位置(进入编译代码中我可能称之为“选择”的节点)。好吧,这会生成已知的列错误,因为该代码不理解在同一级别定义的别名。当我想在查询中使用列别名时,我经常使用子查询,以避免任何混淆。
解决这个问题很容易:使用子查询,在 order by
中使用原始列名,或者在 select
中包含转换值。
关于sql - 在 ORDER BY 子句中转换列别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25528773/