如果我有以下的玩具查询Postgresql plpgsql/sql支持where子句中的短路吗?
SELECT *
FROM my_tables
WHERE my_id in (
SELECT my_other_id
FROM my_other_tables
) AND some_slow_func(arg) BETWEEN 1 AND 2;
将在WHERE子句短路的首要条件这将有一个复杂的运行时间的第二个条件?
我正在研究一些实际上是plpgsql中FOR LOOP部分的sql,并且我可以对my_other_tables中存在的所有记录进行迭代,然后在FOR LOOP的范围内使用some_slow_func( )。但我很好奇,如果SQL支持,或plpgsql支持短路。
一些研究: 我看着在Postgres的邮件列表,发现一般这个说法SQL不支持短路:
http://www.postgresql.org/message-id/[email protected]
但其中一个答复说,为了能够通过强制执行子查询。我不确定他在说什么。我知道子选票是什么,但我不知道如何执行命令?有人能为我澄清这一点吗?
我不认为短路是相关的; SQL应该是面向集合的,其结果不应该依赖于评估的顺序。对这个*的一个限制可能是两个子查询的联合,这两个子查询都带有一个LIMIT,并在整个查询中增加一个额外的LIMIT。但LIMIT仍然是边界线...评估的副作用不应该在真正的关系型RSBMS中实现(可能除了LATERAL)。总之:评估顺序只影响性能,而不是结果的正确性,恕我直言。这就是为什么我们应该把评估顺序留给规划者。 – wildplasser 2013-02-18 22:14:17