2017-08-05 50 views
0

ORDER BY中的数字引用SELECT列表中的列序数位置。 所以下面的查询是等同于“C.custid,C.region”排序:使用CASE语句处理ORDER BY中的数字

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 

在这种情况下,数字被视为列不是顺序位置,但帮助改变排列顺序为硬编码值。

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

由于

+0

在第一种情况下,将'1'视为值是没有意义的,因为它总是相同的,而case语句可能返回不同的值 – FuzzyTree

回答

2

如文档中解释了order by

order_by_expression

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

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

一个表达式可以用于排序,但是如果碰巧现在选择了一列,并且如果表达式值在选择列表中的列数内,您会不会感到惊讶?

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

还要注意:

最佳实践

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

+0

1)感谢您提出它,但我确实知道最好的围绕这个练习。 2)case语句返回表达式,在这种情况下,表达式的类型被解析为一个整数常量(https://docs.microsoft.com/en-us/sql/t-sql/language-elements/expressions- transact-sql和https://docs.microsoft.com/en-us/sql/t-sql/data-types/constants-transact-sql)。所以这种差异在这种情况下非常微妙,但可以用来解释这种行为。谢谢 – umbersar

+0

我已经添加到答案重新:解析。当文档中显示“整数”时,它表示一个[整数常量](https://docs.microsoft。com/en-us/sql/t-sql/data-types/constants-transact-sql),而不是一个表达式,其值为整数类型。在['CREATE [OR ALTER] {PROC | PROCEDURE} [schema_name。] procedure_name [;数字]'](https://docs.microsoft.com/en-us/sql/t-sql/statements/create-procedure-transact-sql)很少使用_number_是一个“可选的整数”。这是另一个表达无法理解的地方,但是一个整数有目的。 – HABO