我必须选择符合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
答案 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必须检索所有行,以便首先找出哪种排序。相关答案详情如下: