使用select distinct时按NULL排序

时间:2016-05-18 20:39:51

标签: sql sql-server sql-server-2008

很抱歉,如果已经询问过,但我搜索过,无法看到解决方案。我在MSSQL Server 2008中有一个查询,如:

SELECT DISTINCT 
ProcedureId 
, UserId 
, FacilityId
, LocationId
FROM ....
WHERE ....
ORDER BY CASE WHEN @sortByProcedure = 0 THEN NULL ELSE 1 END,
                   2, 
                   3, 
                   4

此查询出错:

  如果SELECT DISTINCT为,则

ORDER BY项必须出现在选择列表中   指定。

因为case..when子句正在发生,当我删除它时,它正在工作。我应该替换null那里使它工作?任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:1)

您需要在select中包含该case语句才能按其排序;

SELECT DISTINCT
CASE WHEN @sortByProcedure = 0 THEN NULL ELSE 1 END SortField
, ProcedureId 
, UserId 
, FacilityId
, LocationId
FROM ....
WHERE ....
ORDER BY 
CASE WHEN @sortByProcedure = 0 THEN NULL ELSE 1 END
, ProcedureId
, UserId
, FacilityId
, LocationId

答案 1 :(得分:0)

尝试使用列名和GROUP BY

Select ProcedureId, UserId, FacilityId, LocationId
From ....
Where ....
group by ProcedureId, UserId, FacilityId, LocationId
order by (case when @sortByProcedure = 0 then null else ProcedureId end),
         UserId, FacilityId, LocationId

order by的数字(我认为)已被弃用,这意味着支持可能会在某一天消失。在任何情况下,case中的“1”都不会被解释为列位置。

GROUP BY允许您在表达式中指定列名。 (我真的很惊讶列名不能用于select distinct;其他数据库确实允许使用该构造。)