如果我有以下的玩具查詢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