SQL - OR条件的顺序是否重要?

时间:2014-08-04 15:35:33

标签: sql postgresql sql-order-by union-all

我必须选择符合condition1 OR condition2的一行。但是,condition1更可取。如果有两行,第一行符合condition1(并且不符合条件2),第二行符合condition2(并且不符合condition1),则应返回第一行。

对于SQL:

SELECT * FROM table WHERE col1 = 1 OR col2 = 5 LIMIT 1

它会先返回符合条件col1 = 1的行吗?或者它会以随机顺序返回行吗?如果它是随机的那么如何实现我想要的?我必须使用这样的东西吗?:

SELECT * FROM table WHERE col1 = 1 OR col2 = 5
ORDER BY (col1 = 1)::boolean DESC LIMIT 1

2 个答案:

答案 0 :(得分:4)

WHERE子句中的条件顺序不会影响结果的优先级。你必须使用ORDER BY子句来做到这一点。

答案 1 :(得分:3)

WHERE条件的顺序与基于集合的语言(如SQL)无关 如果没有ORDER BY,您将以任意顺序返回行。你不能依赖真正随机的结果,Postgres可以自由地返回最方便的行,如@Matt commented

但是,使用UNION ALL

可以通过更便宜的方式实现您的目标
SELECT * FROM table WHERE col1 = 1
UNION ALL
SELECT * FROM table WHERE col1 = 5
LIMIT 1;

LIMIT应用于外部查询。只要找到足够的行来满足UNION ALL,Postgres就会停止评估LIMIT 1查询的更多分支。这样,只有col1 = 5没有行才会评估条件col1 = 1。您可以使用EXPLAIN ANALYZE 查看。不会比那便宜。

请注意,这不会与ORDER BY结合使用。然后Postgres必须检索所有行,以便首先找出哪种排序。相关答案详情如下: