我有一个存储过程,必须在根据输入过滤行后返回一个表。其中两个输入是sort_column
and sort_dir
。查询必须 ORDER BYsort_column
in the sort_dir
方向(ASC 或 DESC)。
我尝试过以下查询但没有成功。下面的查询已被简化为仅包含相关条款。其他过滤器工作正常,没有任何问题。
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 服务器版本相对应的手册,了解在第 4 行 'WHEN 'col1' THEN col1_name END CASE 'asc' WHEN 'desc' THEN DESC ELSE ' 附近使用的正确语法
问题似乎不是列名。这是不起作用的排序方向。如果我在没有“ASC”和“DESC”部分的情况下尝试上述每个选项,则没有问题。
我在这里做错了什么吗?
除了 CASE 之外还有更好的方法吗?
MySQL版本:5.6
最好的方法是多种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
and DESC
作为THEN
.
同样重要的是数据类型的问题。 SQL 编译器决定单一类型CASE
表达。当列具有不同类型时,这可能会导致意外问题。
最简单的解决方案就是使用多个CASE
表达式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)