ORDER BY与NULLS首先使用列别名

时间:2012-12-14 21:52:19

标签: sql sql-server

虽然this technique适用于标准列,但我遇到了一些我不理解的问题。我在我的查询中重写结果用于报告目的,需要按别名列'PARENT'排序,如下所示:

select fun.MODULE_ID
    , fun.FUNCTION_ID
    , COALESCE(fun.parent_function, fun2.function_id) as PARENT
    , fun.DESCRIPTION
    , fun.FUNCTION_PURPOSE
from MODULE_FUNCTION fun
LEFT JOIN MODULE_FUNCTION fun2
    ON fun.function_id = fun2.function_id
    AND fun2.function_id IN (SELECT parent_function FROM MODULE_FUNCTION)
ORDER BY MODULE_ID
    , PARENT
    , FUNCTION_ID

这很好用,但我的专栏'PARENT_FUNCTION'及其别名'PARENT'包含空值。我希望这些是在底部。所以当我这样做时:

ORDER BY MODULE_ID
    , case when PARENT is null then 1 else 0 end, PARENT
    , FUNCTION_ID

我收到“无效的列名'父母'。

有什么想法吗? (对SQL来说还是非常新的!)

2 个答案:

答案 0 :(得分:3)

SQL Server不允许您在ORDER BY子句中的之外的其他地方使用列别名(但不在ORDER BY中的表达式中) ,因此您必须重新键入原始列定义。有关此问题的更深入解释(比我能给出的要好得多),请参阅this page

试试这个:

ORDER by MODULE_ID
   , case when COALESCE(fun.parent_function, fun2.function_id) is null then 1 else 0 end
   , FUNCTION_ID

答案 1 :(得分:3)

ORDER BY子句中使用列别名时,它只能单独使用。如果您尝试在表达式中使用它,SQL Server将尝试将其解析为其中一个基表中的列。

例如

DECLARE @T TABLE(X INT, Y int)

INSERT INTO @T 
VALUES (1,3),(2,2),(3,1)

SELECT X AS Y
FROM @T 
ORDER BY Y

Y
-----------
1
2
3

SELECT X AS Y
FROM @T 
ORDER BY Y + 0

Y
-----------
3
2
1

第一个结果集由列别名排序,第二个结果集由基表中的列Y排序。

您可以像在另一个答案中一样重复基础表达式,也可以使用派生表/ cte来投影列,然后可以order by的表达式中使用该投影列

;WITH CTE
     AS (SELECT fun.MODULE_ID,
                fun.FUNCTION_ID,
                COALESCE(fun.parent_function, fun2.function_id) AS PARENT,
                fun.DESCRIPTION,
                fun.FUNCTION_PURPOSE
         FROM   MODULE_FUNCTION fun
                LEFT JOIN MODULE_FUNCTION fun2
                  ON fun.function_id = fun2.function_id
                     AND fun2.function_id IN (SELECT parent_function
                                              FROM   MODULE_FUNCTION))
SELECT *
FROM   CTE
ORDER  BY MODULE_ID,
          CASE
            WHEN PARENT IS NULL THEN 1
            ELSE 0
          END,
          PARENT,
          FUNCTION_ID