【问题标题】:SELECT DISTINCT with ORDER BY and CASE WHENSELECT DISTINCT 与 ORDER BY 和 CASE WHEN
【发布时间】:2021-03-30 15:57:28
【问题描述】:

我的查询是:

SELECT DISTINCT LanguageCode
       FROM myTable
       ORDER BY (CASE WHEN LanguageCode='GB' THEN 0 ELSE 1 END), LanguageCode

目标是获得语言,但首先获得GB语言。 我收到了这个错误:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

我已经看到了这个问题的答案: Reason for - ORDER BY items must appear in the select list if SELECT DISTINCT is specified

但我仍然不明白为什么它适用于我(以及如何解决它),因为我只访问一个列。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 这显然是一个错误。 LanguageCode 确实出现在选择列表中,因此您应该能够按此列和基于它的表达式进行排序。

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


【解决方案1】:

同事发现了一个变通方法:

SELECT DISTINCT (CASE WHEN LanguageCode='GB' THEN 0 ELSE 1 END) AS IsGB, LanguageCode
   FROM myTable
   ORDER BY IsGB ASC, LanguageCode

【讨论】:

    【解决方案2】:

    改为使用聚合:

    SELECT LanguageCode
    FROM myTable
    GROUP BY LanguageCode
    ORDER BY (CASE WHEN LanguageCode = 'GB' THEN 0 ELSE 1 END), 
             LanguageCode
    

    一些数据库对ORDER BY 中的非聚合表达式很挑剔。如果是这种情况,那么您可以使用:

    SELECT LanguageCode
    FROM myTable
    GROUP BY LanguageCode
    ORDER BY MAX(CASE WHEN LanguageCode = 'GB' THEN 0 ELSE 1 END), 
             LanguageCode
    

    【讨论】:

    • 我这边还是一样的错误:/(我为MAX添加了一个括号)
    • @JBHurteaux 。 . GROUP BY 查询无法生成关于 SELECT DISTINCT 的错误。查询中未使用该构造。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多