sql - 在 ORDER BY 子句中转换列别名

标签 sql postgresql casting sql-order-by

鉴于此:

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 also GROUP 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/

相关文章:

MySql group_concat 作为整数列表,而不是字符串

sql - 将存储过程的结果附加到先前执行的存储过程

php - 使用 SQL 和 PHP 进行多重 INSERT/UPDATE

database - 如何让所有序列与 PostgreSQL 中的表绑定(bind)

node.js - 使用 Sequelize js 运行 postgres 函数

c++ - ((MPI_Datatype)1) 在 C++ 中是什么意思?

java - 在 java/processing 中转换变量后得到零值

mysql - SQL ORDER BY 距离无法正常工作

python - psycopg2.编程错误: column "none" does not exist - Update Statement

java - 在评估 spring 集成表达式时获取类转换表达式