ORDER BY CASE表现不正常

时间:2015-04-11 13:31:35

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

我对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

并且排序正确。

2 个答案:

答案 0 :(得分:2)

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

这就是为case设置密钥时最好使用单独的order by语句。试试这个:

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  

答案 1 :(得分:1)

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

请尝试使用此方法:

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