使用CASE语句

时间:2017-08-05 01:08:09

标签: sql sql-server tsql

ORDER BY中的数字引用SELECT列表中的列序号位置。 因此,以下查询相当于由C.custid,C.region':

排序。
SELECT
C.custid, C.region
FROM SALES.Customers AS C
ORDER BY  1, c.region

现在,如果我使用CASE语句,以便我希望区域列中的NULL值最后排序,那么我会做类似的事情:

SELECT
C.custid, C.region
FROM SALES.Customers AS C
ORDER BY  CASE WHEN C.region IS NULL THEN 1 ELSE 0 END, C.region

在这种情况下,数字不会被视为列的序数位置,而是作为有助于更改排序顺序的硬编码值。

如果我的理解是正确的,为什么会出现这种差异?背后的原因?

由于

1 个答案:

答案 0 :(得分:2)

正如order by的文档中所述:

  

order_by_expression

     

指定要对查询结果集进行排序的列或表达式。可以将排序列指定为名称或   列别名,或表示位置的非负整数   选择列表中的列。

这里的关键是非负整数表示的位置  列,而不是表达式

表达式可以用于排序,但如果恰好选择一个列,然后表达式值是否在选择列表中的列数内,你会不会感到惊讶?

在解析语句时,数据库需要明确区分位置列或要排序的表达式,例如: Checksum( HatSize )。在这种情况下的规则是整数常量按位置指定列,任何其他表达式,不管数据类型如何,例如,列名称或Len( Name ),指定要排序的值。

另请注意:

  

最佳实践

     

避免将ORDER BY子句中的整数指定为位置   选择列表中列的表示。