gpt4 book ai didi

MySQL:如何将 CASE 用于 ORDER BY 子句

转载 作者:行者123 更新时间:2023-11-29 04:36:48 24 4
gpt4 key购买 nike

我有一个存储过程,它必须在根据输入过滤行后返回一个表。其中两个输入是 sort_columnsort_dir。查询必须按 sort_dir 方向(ASC 或 DESC)中的 sort_column 进行排序。

我尝试了以下查询但没有成功。以下查询已简化为仅包含相关条款。其他过滤器可以正常工作,没有任何问题。

  1. SELECT * FROM table ORDER BY sort_column sort_dir
  2. SELECT * FROM table ORDER BY CASE sort_column
    当 'col1' 然后 col1_name
    WHEN 'col2' THEN col2_name 结束
    CASE sort_dir WHEN 'asc' 然后 ASC
    否则描述结束

  3. 我以 _ 格式将 2 个输入连接到 1 个并尝试这样做:

    SELECT * FROM table ORDER BY CASE sort_input
    WHEN 'col1_asc' THEN col1_name ASC
    WHEN 'col1_desc' THEN col1_name DESC
    WHEN 'col2_asc' THEN col2_name ASC
    WHEN 'col2_desc' THEN col2_name DESC END

我总是收到错误 #1064。它在上述每种情况下都不同,但始终指向“CASE”部分。这是上面提到的选项编号 2 的错误

##1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHEN 'col1' THEN col1_name END CASE 'asc' WHEN 'desc' THEN DESC ELSE ' at line 4

问题似乎不是列名。这是不起作用的排序方向。如果我在没有“ASC”和“DESC”部分的情况下尝试上述每个选项,则没有问题。

我是不是做错了什么?除了 CASE 之外,还有更好的方法来解决这个问题吗?

MySQL版本:5.6

最佳答案

最好的方法是多个case:

ORDER BY (CASE WHEN sort_input = 'col1_asc' THEN col1_name END) ASC,
(CASE WHEN sort_input = 'col1_desc' THEN col1_name END) DESC,
(CASE WHEN sort_input = 'col2_asc' THEN col2_name END) ASC,
(CASE WHEN sort_input = 'col2_desc' THEN col2_name END) DESC,

这可能看起来很冗长。但是,请记住 CASE 是一个返回单个值的表达式。因此,您不能将 ASCDESC 作为 THEN 的一部分。

同样重要的是数据类型的问题。 SQL 编译器决定CASE 表达式的单一类型。当列具有不同类型时,这可能会导致意外问题。

最简单的解决方案就是使用多个 CASE 表达式。

关于MySQL:如何将 CASE 用于 ORDER BY 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39291488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com