Sql server MSSQL-ORDERBY子句中的CASE语句是否返回列序号?

Sql server MSSQL-ORDERBY子句中的CASE语句是否返回列序号?,sql-server,sql-order-by,case,Sql Server,Sql Order By,Case,我在这里遇到了一个建议(),它显示了一个CASE语句,在一个包含4列的表上的orderby子句中返回整数 SELECT npID, title, URL, issue FROM tbl ORDER BY substring(issue, 1, 4) DESC ,CASE WHEN substring(issue, 6, 100) IN ('Winter','First_Quarter') THEN 1 WHEN substring(i

我在这里遇到了一个建议(),它显示了一个CASE语句,在一个包含4列的表上的orderby子句中返回整数

SELECT npID, title, URL, issue
FROM   tbl
ORDER  BY substring(issue, 1, 4) DESC
      ,CASE 
          WHEN substring(issue, 6, 100) IN ('Winter','First_Quarter')  THEN 1
          WHEN substring(issue, 6, 100) IN ('Summer','Second_Quarter') THEN 2
          WHEN substring(issue, 6, 100) IN ('Spring','Third_Quarter')  THEN 3
          WHEN substring(issue, 6, 100) IN ('Fall',  'Fourth Quarter') THEN 4
          ELSE 5 
       END;

我不明白这是怎么回事。很明显,由大小写生成的整数不是列序号(例如,ELSE 5,因为该表只有4列)。但这是什么意思呢?--从上下文来看,它们似乎是用来订购的,但我从未在ORDER BY中见过这种情况。(然而,这篇文章中给出的例子很有用,所以我真的很困惑。)有人能解释一下在ORDERBY子句中的CASE语句中返回整数意味着什么吗?谢谢。

CASE语句中的整数值不是列序号,它们是用于对结果排序的静态整数值

子字符串(问题,1,4)DESC对记录排序后

子字符串(第6100期)
'Winter'
'First\u Quarter'
时,将首先对其进行排序

子字符串(问题6100)
'Summer'
'Second\u Quarter'
时,它将在
'Winter'
'First\u Quarter'之后排序

等等

为了更好地理解,您可以选择案例并查看结果

SELECT npID, title, URL, issue,CASE 
          WHEN substring(issue, 6, 100) IN ('Winter','First_Quarter')  THEN 1
          WHEN substring(issue, 6, 100) IN ('Summer','Second_Quarter') THEN 2
          WHEN substring(issue, 6, 100) IN ('Spring','Third_Quarter')  THEN 3
          WHEN substring(issue, 6, 100) IN ('Fall',  'Fourth Quarter') THEN 4
          ELSE 5 
       END
FROM   tbl
ORDER  BY substring(issue, 1, 4) DESC
      ,CASE 
          WHEN substring(issue, 6, 100) IN ('Winter','First_Quarter')  THEN 1
          WHEN substring(issue, 6, 100) IN ('Summer','Second_Quarter') THEN 2
          WHEN substring(issue, 6, 100) IN ('Spring','Third_Quarter')  THEN 3
          WHEN substring(issue, 6, 100) IN ('Fall',  'Fourth Quarter') THEN 4
          ELSE 5 
       END;
ORDERBY子句中的CASE语句是否返回列序号

没有

下面的语句仅更改值在该列中的显示顺序

CASE 
          WHEN substring(issue, 6, 100) IN ('Winter','First_Quarter')  THEN 1
          WHEN substring(issue, 6, 100) IN ('Summer','Second_Quarter') THEN 2
          WHEN substring(issue, 6, 100) IN ('Spring','Third_Quarter')  THEN 3
          WHEN substring(issue, 6, 100) IN ('Fall',  'Fourth Quarter') THEN 4
          ELSE 5 
       END;*emphasized text*

这些整数不是列序号,而是值文字。查询首先按
问题
列(表示年份)的前四个字符排序。然后,根据由
case
表达式表示的辅助键对它们进行排序。这里使用的值本身并不有趣,重要的是它们之间的相对顺序。例如,
2
,为夏季发行计算没有任何意义——只是它在冬季之后(按1计算)和春季之前(按3计算)。查询可以使用“a”、“b”、“c”、“d”和“e”来代替,并得到完全相同的结果。

ORDER BY
子句中的项被认为是序数的唯一时间是当它是整数文本时,查看sql-92标准,我们可以看到其来源:

如果包含,则 应大于0且不大于 T的阶数。将T列标识为 由指定的顺序位置


如果
ORDER BY
子句包含非常量标量表达式,例如,则该表达式的结果将用作排序键,也就是说,如果它计算结果集中的一行并返回一个整数n,则它是按其排序的n的值。

orderby
接受按名称、序号或表达式列出的列列表-如您的
案例中为结果集中的每一行计算的
,每次求值都返回一个1到5之间的整数,该值用作排序键。AlexK--我还是不明白。你说“序数或表达式”。引擎如何区分序数(毕竟,它是一个表达式)和“表达式”之间的区别?如果它是单个整数文本,如
5
,则它是序数-这是指定一个的唯一方法,
按1+1下单
/
按@int\u var下单
都会导致错误。查看sql-92标准,我们可以看到来源:如果a包含,然后,值应大于0且不大于T的度数。用指定的顺序位置标识T列。(T=列计数)所以内部解析规则大概是-如果它是一个列名称顺序,如果它是一个整数顺序,如果它是一个列编号,如果它是一个非常量标量表达式顺序,那么它是。我有点明白必须发生什么,但是这是在哪里记录的?我认为一个案例的结果只是简单地放入查询中,因此您将得到类似于orderbyxyz的内容,3表示名为xyz的列上的顺序,然后是第三个结果列上的顺序。从什么时候开始,您可以像在列中一样弹出一个值?这仅仅是一种特殊的方式吗?为什么不在解释CASE的地方记录这一点呢?此外,我还看到了CASE语句输出columnname的其他示例——显然,在这种情况下,其含义是,处理结果的方式应该与处理列名的顺序相同。为什么要对整数进行这种特殊处理?将整数放入SELECT中的一列,然后对该列进行排序,这不是更为一致吗?非常感谢您的解释。但我已经看过了那个页面,实际上它并没有显示CASE返回整数的例子。它只显示返回列名的大小写。不,在MSDN示例中,
THEN BusinessEntityID END
不返回名称
BusinessEntityID
它返回该行上的
BusinessEntityID
的值-这是一个与任何整数相同的整数-
THEN 42 END
AlexK:但它不是“与任何整数相同”“是吗?我的意思是,如果你把一个整数按顺序排列,它就意味着一列序号。为什么在这一点上,如果您只是简单地替换了该值而没有使用案例,那么案例的结果与您期望的结果不符?这个问题我已经问了三次了,没有人回答。谢谢,是的,我知道发生了什么。我只是感到震惊。我的意思是,为什么CASE要以一种方式依次工作,如果它返回一个整数,如果它返回一个columnname,则以另一种方式工作?特别是因为“normaly”是一个按顺序排列的整数,它的意思是列序号。我不是怀疑,只是问,这些记录在哪里?这是否意味着我不能在orderby中使用CASE来返回列或