我在这里遇到了一个建议(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语句中返回整数意味着什么吗?谢谢。
答案 0 :(得分:2)
ORDER BY
子句中的项被认为是序数的唯一时间是它的整数文字,看看sql-92标准我们可以看到它的起源:
如果< sort specification>包含<无符号整数>,然后是 <无符号整数>应大于0且不大于 T的度数<排序规范>标识T的列 由<无符号整数>指定的序数位置。
如果ORDER BY
子句包含非常量标量表达式,例如CASE
,那么该表达式的结果将用作排序键,即,如果它评估结果集中的行并返回一个整数 n 它是 n 的值,它是按照它排序的。
答案 1 :(得分:1)
DataBoundTreeView
语句中出现的整数值不是列序号,它们是用于对结果进行排序的静态整数值。
按CASE
,
当substring(issue, 1, 4) DESC
为substring(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*