【问题标题】:ORDER BY CASE not behaving correctlyORDER BY CASE 行为不正确
【发布时间】:2015-04-11 13:31:34
【问题描述】:

我对 ORDER BY CASE 有一个令人费解的问题:

我编写了一个带有 VARCHAR(50) 参数“sortBy”的测试过程:

BEGIN

SELECT N.Num_Of_Users, N.Noun_Created FROM NOUNS N 
ORDER BY CASE sortBy
    WHEN 'numReviews' THEN Num_Of_Users 
     ELSE Noun_Created END DESC;
END

如果我用除 varchar 'numReviews' 以外的任何东西调用这个 proc,它会按预期按 Noun_Created 排序,但如果我用 'numReviews' 调用它,它根本不会排序。

对此感到困惑,我将排序硬编码为:

BEGIN
SELECT N.Num_Of_Users, N.Noun_Created FROM NOUNS N 
ORDER BY Num_Of_Users;
END

而且排序正确。

【问题讨论】:

    标签: mysql sql sorting sql-order-by case


    【解决方案1】:

    我的猜测是Num_Of_UsersNoun_Created 有不同的类型。因此,SQL 引擎最终会进行类型转换(通常为字符串)——而您不会得到预期的结果。

    这就是为什么在为order by 设置键时最好使用单独的case 语句。试试这个:

    ORDER BY (CASE WHEN sortBy = 'numReviews' THEN Num_Of_Users END),
             (CASE WHEN sortBy = 'numReviews' THEN NULL ELSE Noun_Created END) DESC;
    

    如果你只有一个选择,第二个case 是不必要的。您可以使用:

    ORDER BY (CASE WHEN sortBy = 'numReviews' THEN Num_Of_Users END),
             Noun_Created  
    

    【讨论】:

    • 为什么它们是不同的类型很重要?
    • 因为case 语句返回具有明确定义类型的单个值。如果when 子句的类型不同,则需要将某些值转换为其他值。
    【解决方案2】:

    看起来两列的数据类型不同——一列是数字,另一列是字符串。这可能会在排序时导致一些混乱。

    试试这个方法:

    BEGIN
    
    SELECT N.Num_Of_Users, N.Noun_Created FROM NOUNS N 
    ORDER BY CASE sortBy  WHEN 'numReviews' END DESC,
             CASE WHEN sortBy <> 'numReviews' THEN Num_Of_Users END DESC
    END
    

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多