Sql 使用CASE语句按顺序处理数字

Sql 使用CASE语句按顺序处理数字,sql,sql-server,tsql,Sql,Sql Server,Tsql,按顺序排列的数字指的是选择列表中的列序号位置。 因此,以下查询相当于按“C.custid,C.region”排序: SELECT C.custid, C.region FROM SALES.Customers AS C ORDER BY 1, c.region 现在,如果我使用CASE语句,希望region列中的NULL值最后排序,那么我将执行如下操作: SELECT C.custid, C.region FROM SALES.Customers AS C ORDER BY CASE WH

按顺序排列的数字指的是选择列表中的列序号位置。 因此,以下查询相当于按“C.custid,C.region”排序:

SELECT
C.custid, C.region
FROM SALES.Customers AS C
ORDER BY  1, c.region
现在,如果我使用CASE语句,希望region列中的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
在这种情况下,数字不会被视为列的顺序位置,而是被视为有助于更改排序顺序的硬编码值

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


如文档中所述,感谢:

按表达式排序

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

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

表达式可以用于排序,但是如果碰巧时不时地选择一列,并且表达式值在选择列表中的列数范围内,您不会感到惊讶吗

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

另请注意:

最佳做法

避免将ORDERBY子句中的整数指定为位置整数 选择列表中列的表示形式


如以下文件所述:

按表达式排序

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

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

表达式可以用于排序,但是如果碰巧时不时地选择一列,并且表达式值在选择列表中的列数范围内,您不会感到惊讶吗

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

另请注意:

最佳做法

避免将ORDERBY子句中的整数指定为位置整数 选择列表中列的表示形式


在第一种情况下,将
1
视为一个值是没有意义的,因为它总是相同的,而case语句可能返回不同的值在第一种情况下,将
1
视为一个值是没有意义的,因为它总是相同的,而case语句可能返回不同的值1)感谢您带来的帮助这很难,但我知道这方面的最佳实践。2) case语句返回表达式,在本例中,表达式的类型被解析为整数常量(and)。因此,在这种情况下,差异非常细微,但可以用来解释这种行为。谢谢,我在答案中添加了:解析。当文档中提到“integer”时,它指的是一个表达式,而不是一个计算结果为整数类型的表达式。在这个很少使用的数字中,数字是一个“可选整数”。这是另一个表达式没有意义的地方,但整数有它的用途。1)谢谢你提出这个问题,但我知道这方面的最佳实践。2) case语句返回表达式,在本例中,表达式的类型被解析为整数常量(and)。因此,在这种情况下,差异非常细微,但可以用来解释这种行为。谢谢,我在答案中添加了:解析。当文档中提到“integer”时,它指的是一个表达式,而不是一个计算结果为整数类型的表达式。在这个很少使用的数字中,数字是一个“可选整数”。这是另一个表达式没有意义的地方,但整数有其用途。