我有一个存储过程,必须在根据输入过滤行后返回一个表。其中两项输入为sort_column
和sort_dir
。查询必须在sort_column
方向(ASC或DESC)中按ORDER BY sort_dir
。
我尝试了以下查询,但徒劳无功。以下查询已简化为仅包含相关条款。其他过滤器正常工作,没有任何问题。
SELECT * FROM table ORDER BY sort_column sort_dir
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
我以格式_将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 - 您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以便在'WHEN'col1'附近使用正确的语法。然后col1_name END CASE'asc'在第4行'desc'那么DESC ELSE'
问题似乎不是列名。这是排序方向不起作用。如果我在没有'ASC'和'DESC'部分的情况下尝试上述每个选项,就没有问题。
我在这里做错了吗? 除了CASE之外,还有更好的方法吗?
MySQL版本:5.6
答案 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
是一个返回单个值的表达式。因此,您不能将ASC
和DESC
作为THEN
的一部分。
同样重要的是数据类型的问题。 SQL编译器决定CASE
表达式的单个类型。当列具有不同类型时,这可能会导致意外问题。
最简单的解决方案就是使用多个CASE
表达式。