【问题标题】:Using 'case' in ORDER BY (MySQL)在 ORDER BY (MySQL) 中使用“case”
【发布时间】:2014-09-19 13:27:08
【问题描述】:

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

这边

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'两个词中出现错误,我怎样才能使它起作用??

【问题讨论】:

标签: mysql sql-order-by


【解决方案1】:

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

您还应该分隔字段。在 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,并且我会使用一组允许的排序值来保证它的安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多