按顺序编号,请参考选择列表中的列序号位置。因此,以下查询相当于按'C.custid,C.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在这种情况下,数字不被视为列的序号位置,而是作为硬编码值来处理,这有助于更改排序顺序。
如果我的理解是正确的,为什么会有这种差异?背后的原因?
谢谢
发布于 2017-08-05 02:03:49
如order by文档中所解释的那样
order_by_expression 指定对查询结果集进行排序的列或表达式。排序列可以指定为名称或列别名,或表示列在select列表中的位置的非负整数。
这里的键是非负整数,表示列的位置,而不是表达式。
表达式可以用于排序,但是如果它偶尔选择一个列,如果表达式值在select列表中的列数之内,您不会感到惊讶吗?
在解析语句时,数据库需要明确区分位置列或要排序的表达式,例如Checksum( HatSize )。本例中的规则是,整数常量按位置指定列,任何其他表达式,无论数据类型如何,例如列名或Len( Name ),都指定要排序的值。
还请注意:
最佳实践 避免将ORDER子句中的整数指定为select列表中列的位置表示形式。
https://stackoverflow.com/questions/45517274
复制相似问题