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_Users
和 Noun_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
我对 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_Users
和 Noun_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