mysql - 在 ORDER BY 中使用 'case' (MySQL)

标签 mysql sql-order-by

我正在处理一个返回巨大选择的过程,我不想定义它的顺序。 我不想选择三个字段中的一个,如果它是升序或降序,如果这三个选项都没有定义,则默认返回第一个降序字段

这边走

ORDER BY 
CASE option1 
    WHEN 0 THEN                 
        CASE option2 
            WHEN 0 THEN firstField DESC
            WHEN 1 THEN firstField ASC
        END 
    WHEN 1 THEN             
        CASE option2 
            WHEN 0 THEN secondField DESC
            WHEN 1 THEN secondField ASC
        END 
    WHEN 2 THEN             
        CASE option2 
            WHEN 0 THEN thirdField DESC
            WHEN 1 THEN thirdField ASC
        END                 
    ELSE 
        firstField DESC
    END 
END;

当然,这不起作用... mysql 指责单词“DESC”和“ASC”中的错误,我怎样才能使其起作用?

最佳答案

为了做到这一点,您必须将 DESC/ASC 移到大小写之外,因为它们位于表达式之后。

您还应该分隔字段。在 CASE 语句中,如果字段具有不同的数据类型,它们将被转换为适合所有数据类型的数据类型(通常是 VARCHAR),这可能会打乱排序。

你可以这样做:

ORDER BY CASE WHEN option1=0 AND option2=0 THEN firstField END DESC, 
         CASE WHEN option1=0 AND option2=1 THEN firstField END ASC, 
         CASE WHEN option1=1 AND option2=0 THEN secondField END DESC,
         CASE WHEN option1=1 AND option2=1 THEN secondField END ASC,
         CASE WHEN option1=2 AND option2=0 THEN thirdField END DESC,
         CASE WHEN option1=2 AND option2=1 THEN thirdField END ASC,
         firstField DESC 

当不适用时,每种情况都会为所有行返回 NULL,因此具有相同的值。事实上,第一种情况是不必要的,因为它会被默认捕获,但为了清楚起见,我将其包括在内。然而,这可能会导致非常昂贵的订购过程!

我想我更愿意动态构建 SQL,并且使用允许的排序值数组来保证其安全。

关于mysql - 在 ORDER BY 中使用 'case' (MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25935109/

相关文章:

mysql - 排序和限制

java - Hibernate 批量插入内存泄漏

mysql - 如何对旧行和新行执行 INSERT ... ON DUPLICATE KEY UPDATE?

mysql - Centos - yum 更新因依赖项引发后缀错误

mysql - 如何根据丰度对行进行排序?

Mysql慢查询: INNER JOIN + ORDER BY causes filesort

mysql - SQL根据多对多关系中的条件对记录进行排序

MySQL:如何使用RFC112格式对日期进行排序?

php - S3 文件管理框架 - PHP/MySQL

php - API 使用限制