MySQL:如何对 ORDER BY 子句使用 CASE
P粉463291248
P粉463291248 2023-11-01 17:44:15
0
1
667

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

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

  1. SELECT * FROM 表 ORDER BY sort_column sort_dir
  2. 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

  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 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 4 行的 'WHEN 'col1' THEN col1_name END CASE 'asc' WHEN 'desc' THEN DESC ELSE ' 附近使用的正确语法

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

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

MySQL版本:5.6

P粉463291248
P粉463291248

全部回复(1)
P粉294954447

最好的方法是多个案例

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板