ORDER BY CASE 行为不正确

ORDER BY CASE not behaving correctly

我对 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' 以外的任何东西调用此过程,它会按预期按 Noun_Created 排序,但如果我用 'numReviews' 调用它,它根本不会排序。

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

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

并且排序正确。

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

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

试试这个方法:

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