我对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
并且排序正确。
答案 0 :(得分:2)
我的猜测是Num_Of_Users
和Noun_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