MSSQL - ORDER BY 子句中的 CASE 语句 return 列序数?

MSSQL - does a CASE statement in an ORDER BY clause return column ordinals?

我 运行 在此 (SQL: ORDER BY using a substring within a specific column... possible?) 中提出了一个建议,该建议显示了一个 CASE 语句 return 在具有 4 列的 table 的 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,因为 table 只有 4 列)。但它们是什么意思? -- 上下文使它们看起来好像要用于 THEMSELVES 进行订购,但我从未在 ORDER BY 中看到过这种情况。 (但是,post 中给出的示例有效,所以我真的很困惑。)有人可以解释一下 ORDER BY 子句中 CASE 语句中 return 整数的含义吗?谢谢。

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

substring(issue, 1, 4) DESC

对记录进行排序后

substring(issue, 6, 100)'Winter''First_Quarter'则优先排序,

substring(issue, 6, 100)'Summer''Second_Quarter' 时,它将排在 'Winter''First_Quarter'

之后

等等..

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

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;

does a CASE statement in an ORDER BY clause return column ordinals?

没有

以下语句仅更改值在该列中出现的顺序

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*

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

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

If a <sort specification> contains an <unsigned integer>, then the <unsigned integer> shall be greater than 0 and not greater than the degree of T. The <sort specification> identifies the column of T with the ordinal position specified by the <unsigned integer>.

如果 ORDER BY 子句包含 non-constant 标量表达式,例如 CASE,则该表达式的结果将用作排序键,即如果它计算结果集和 returns 一个整数 n 它是排序所依据的 n 的值。