Postgres 条件并集?

use*_*131 8 sql postgresql union

如果我有疑问:-

SELECT foo FROM baa where foo='value'
Run Code Online (Sandbox Code Playgroud)

SELECT foo FROM wobble WHERE foo='value'
Run Code Online (Sandbox Code Playgroud)

我可以在 postgres 中编写一个 SQL 查询,这样如果第一个查询在不使用公用表表达式或重复第一个查询的情况下返回结果,则第二个查询不会运行吗?

原因是两个查询都相当繁重,第二个查询是第一个查询不返回结果的情况下的后备。

Pat*_*ick 4

我怀疑它是否可以用普通 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;
Run Code Online (Sandbox Code Playgroud)

函数STABLE波动性修饰符允许查询规划器优化连续调用,但您不应VOLATILE在查询中使用任何函数调用。

现在您可以简单地

SELECT * FROM run_heavy_query();
Run Code Online (Sandbox Code Playgroud)