sql - 在 ORDER BY 中使用带有别名列的计算

标签 sql sql-server sql-order-by alias

众所周知,ORDER BY子句在SELECT子句之后处理,所以SELECT子句中的列别名可以是用过。

但是,我发现我不能在 ORDER BY 子句的计算中使用别名列。

WITH data AS(
    SELECT *
    FROM (VALUES
        ('apple'),
        ('banana'),
        ('cherry'),
        ('date')
    ) AS x(item)
)
SELECT item AS s
FROM data
--  ORDER BY s;         -- OK
--  ORDER BY item + ''; -- OK
ORDER BY s + '';        -- Fails

我知道有其他方法可以执行此特定查询,而且我知道这是一个微不足道的计算,但我想知道为什么列别名在计算中不起作用。

我已经在 PostgreSQL、MariaDB、SQLite 和 Oracle 中进行了测试,它按预期工作。 SQL Server 似乎是个异常(exception)。

最佳答案

documentation明确指出:

The column names referenced in the ORDER BY clause must correspond to either a column or column alias in the select list or to a column defined in a table specified in the FROM clause without any ambiguities. If the ORDER BY clause references a column alias from the select list, the column alias must be used standalone, and not as a part of some expression in ORDER BY clause:

从技术上讲,您的查询应该有效,因为 order by 子句是 逻辑上 在 select 子句之后计算的,并且它应该可以访问在 select 子句中声明的所有表达式。但是,如果查看 无法访问 SQL 规范,我无法评论它是否是 SQL Server 的限制或其他 RDBMS 将其作为奖励功能实现的限制。

无论如何,您可以使用 CROSS APPLY 作为技巧....它是 FROM 子句的一部分,因此表达式应该在所有后续子句中可用:

SELECT item
FROM t
CROSS APPLY (SELECT item + '') AS CA(item_for_sort)
ORDER BY item_for_sort

关于sql - 在 ORDER BY 中使用带有别名列的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70675707/

相关文章:

sql - 子查询百分比中多于一行

php - 从多表查询中删除

sql-server - SQL 查询 - 2000 万条记录 - 返回信息的最佳实践

sql - 如何用SQL UNION指定订单结果?

mysql - Mysql group_concat 对连接列进行排序正确,但对其余列排序不正确?

PHP/SQL 服务器 : Change <div> color according to time

mysql - MySQL中SELECT一个文本列的场景

sql-server - 从两个表中选择一个

sql-server - SQL Server 2008 可以每秒处理 300 个事务吗?

sql-server - 使用 CASE 函数自定义查询输出排序