我有一个存储过程,它必须在根据输入过滤行后返回一个表。其中两个输入是 sort_column
和 sort_dir
。查询必须在 sort_dir
方向(ASC 或 DESC)中 ORDER BY sort_column
。
我尝试了以下查询,但没有成功。下面的查询已被简化为仅包含相关条款。其他过滤器工作正常,没有任何问题。
SELECT * FROM 表 ORDER BY sort_column sort_dir
SELECT * FROM 表 ORDER BY CASE sort_column
当 'col1' 那么 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
最好的方法是多个
案例
:这可能看起来很冗长。但是,请记住
CASE
是返回单个值的表达式。因此,您不能将ASC
和DESC
作为THEN
的一部分。同样重要的是数据类型的问题。 SQL 编译器决定
CASE
表达式的单一类型。当列具有不同类型时,这可能会导致意外问题。最简单的解决方案就是使用多个
CASE
表达式。