如果我有疑问:-
SELECT foo FROM baa where foo='value'
和
SELECT foo FROM wobble WHERE foo='value'
我能否在 postgres 中编写一个 SQL 查询,以便如果第一个查询返回结果而不使用公共(public)表表达式或重复第一个查询,则第二个查询不运行?
原因是两个查询都比较重,在第一个查询没有返回结果的情况下,第二个查询是回退。
最佳答案
我怀疑它是否可以在纯 SQL 中完成,但在 PL/pgSQL 函数中它相当简单,假设两个查询返回相同的列集。鉴于这两个查询都是“繁重的”,函数开销是最小的。一个额外的功能是查询计划被缓存,因此连续调用会更快。另一个额外的功能是您可以将 foo
设为参数,这样您就可以查询除“值”之外的其他内容。
CREATE FUNCTION run_heavy_query()
RETURNS TABLE (foo text, ...) AS $$
BEGIN
RETURN QUERY SELECT foo FROM baa WHERE foo='value';
IF NOT FOUND THEN
RETURN QUERY SELECT foo FROM wobble WHERE foo='value';
END IF;
END; $$ LANGUAGE plpgsql STABLE;
STABLE
函数波动修饰符允许查询规划器优化连续调用,但您不应在查询中使用任何 VOLATILE
函数调用。
现在你可以简单地
SELECT * FROM run_heavy_query();
关于sql - Postgres 条件联合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39162608/