【问题标题】: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 

【问题讨论】:

  • Edit 问题并提供minimal reproducible example,即表格的CREATE 语句(粘贴文本,不要使用图像),@987654325 @ 用于示例数据 (dito) 的语句以及带有表格文本格式的示例数据的所需结果。

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


【解决方案1】:

您需要单独的 case 表达式。我不确定123 代表什么。让我假设它们旨在将结果按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 表达式返回一种数据类型的单列。我假设classcodenvarchar 列,因此将从日期到现在的时间差转换为nvarchar(100)。此外,假设列 date 的值在当前日期/时间之前,并且小于 1000000000 秒,因此,它上面的表达式会提供一个填充为 0 的字符串,它可以很好地按升序排序,就像在日期上向后排序一样.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      相关资源
      最近更新 更多