我正在一个程序中返回一个巨大的选择,我不想定义它是如何订购的。 我不会选择三个字段中的一个,如果它将是升序或降序,如果三个选项都没有定义,则默认返回降序中的第一个字段
这样
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'中会出现错误,我怎样才能使这个有效???
答案 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,并且我会使用一组允许的排序值来保证它的安全。