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