【问题标题】:Order By case when then with multiple ASC/DESC [closed]使用多个 ASC/DESC 按大小写 [关闭]
【发布时间】:2021-03-05 11:09:59
【问题描述】:
希望这个问题还没有被问到。
我的问题是:
你知道怎么做这样的事
ORDER BY
CASE
WHEN job = "jounalist" then 1, date desc
WHEN job = "teacher" then 2, class asc
WHEN job = "dev" then 3, code asc
ELSE 4
【问题讨论】:
标签:
sql
sql-order-by
case
case-when
【解决方案1】:
您需要单独的 case 表达式。我不确定1、2 和3 代表什么。让我假设它们旨在将结果按CASE 表达式的顺序排列:
ORDER BY (CASE WHEN job = 'journalist' THEN 1
WHEN job = 'teacher' THEN 2
WHEN job = 'dev' THEN 3
ELSE 4
END),
(CASE WHEN job = 'journalist' THEN date END) DESC,
(CASE WHEN job = 'teacher' THEN class END),
(CASE WHEN job = 'code' THEN code END)
CASE 表达式返回单一类型。为此,我不建议将值转换为单一类型。相反,只需在 ORDER BY 中为不同的组使用单独的键。
我还应该指出,某些数据库可能具有可以简化某些代码的特殊功能。
【解决方案2】:
ORDER BY
CASE
WHEN job = "jounalist" then 1
WHEN job = "teacher" then 2
WHEN job = "dev" then 3
ELSE 4
END asc
CASE
WHEN job = "jounalist" then Right(cast(1000000000 + Datediff(second, date, GetDate()) as nvarchar(100)), 9)
WHEN job = "teacher" then class
WHEN job = "dev" then code
ELSE N''
END asc
您只能从 case 表达式返回一种数据类型的单列。我假设class 和code 是nvarchar 列,因此将从日期到现在的时间差转换为nvarchar(100)。此外,假设列 date 的值在当前日期/时间之前,并且小于 1000000000 秒,因此,它上面的表达式会提供一个填充为 0 的字符串,它可以很好地按升序排序,就像在日期上向后排序一样.