MSSQL - 在ORDER BY子句中返回一个CASE语句返回列序号?

时间:2017-01-31 17:54:56

标签: sql-server sql-order-by case

我在这里遇到了一个建议(SQL: ORDER BY using a substring within a specific column... possible?),它显示了一个CASE语句,在一个包含4列的表的ORDER BY子句中返回整数。

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;

我不明白这是如何运作的。显然,CASE产生的整数不是列序数(例如,ELSE 5,因为表只有4列)。但他们的意思是什么? - 上下文使它看起来似乎是用于主题订购,但我从来没有在ORDER BY中看到过这种情况。 (但是,帖子中给出的例子很有用,所以我真的很困惑。)有人可以解释在ORDER BY子句中的CASE语句中返回整数意味着什么吗?谢谢。

4 个答案:

答案 0 :(得分:2)

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

  

如果< sort specification>包含<无符号整数>,然后是   <无符号整数>应大于0且不大于   T的度数<排序规范>标识T的列   由<无符号整数>指定的序数位置。

如果ORDER BY子句包含非常量标量表达式,例如CASE,那么该表达式的结果将用作排序键,即,如果它评估结果集中的行并返回一个整数 n 它是 n 的值,它是按照它排序的。

答案 1 :(得分:1)

DataBoundTreeView语句中出现的整数值不是列序号,它们是用于对结果进行排序的静态整数值。

CASE

订购记录后

substring(issue, 1, 4) DESCsubstring(issue, 6, 100)'Winter'时,它会先排序,

'First_Quarter'substring(issue, 6, 100)'Summer'时,它会在'Second_Quarter''Winter'之后排序

依旧......

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

'First_Quarter'

答案 2 :(得分:1)

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

答案 3 :(得分:0)

  

ORDER BY子句中的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*