如果我有疑问: -
SELECT foo FROM baa where foo='value'
和
SELECT foo FROM wobble WHERE foo='value'
我可以在postgres中编写一个SQL查询,以便第一个查询在不使用公用表表达式或重复第一个查询的情况下返回结果时,第二个查询不会运行吗?
原因是两个查询都非常繁重,第二个查询是第一个查询不返回结果的回退。
答案 0 :(得分:2)
我怀疑它可以在纯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();