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

时间:2014-09-19 13:27:08

标签: 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'中会出现错误,我怎样才能使这个有效???

1 个答案:

答案 0 :(得分:1)

为了做到这一点,你必须在表达式之后将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,并且我会使用一组允许的排序值来保证它的安全。