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

时间:2016-09-02 11:39:03

标签: mysql

我有一个存储过程,必须在根据输入过滤行后返回一个表。其中两项输入为sort_columnsort_dir。查询必须在sort_column方向(ASC或DESC)中按ORDER BY sort_dir

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

  1. SELECT * FROM table ORDER BY sort_column sort_dir
  2. SELECT * FROM table ORDER BY CASE sort_column WHEN 'col1' THEN col1_name WHEN 'col2' THEN col2_name END CASE sort_dir WHEN 'asc' THEN ASC ELSE DESC END

  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
    
  4. 我总是得到错误#1064。在上述每种情况下都有所不同,但始终指向“CASE”部分。这是上面提到的选项编号2的错误

      

    ## 1064 - 您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以便在'WHEN'col1'附近使用正确的语法。然后col1_name END CASE'asc'在第4行'desc'那么DESC ELSE'

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

    我在这里做错了吗? 除了CASE之外,还有更好的方法吗?

    MySQL版本:5.6

1 个答案:

答案 0 :(得分:3)

最佳方法是多个cases

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表达式。