sql - Postgres 条件联合?

标签 sql postgresql union

如果我有疑问:-

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/

相关文章:

SQL:根据另一列中的值将金额转换并计算为负数

postgresql - 使用 PSQL 命令查找主机名和端口

t-sql - 联合所有 - 3 个表,其中 2 个永远不会包含重复项,另一个将包含重复项

java - 如何实现集合论与对象集的并集和交集

postgresql - 我如何发现 PostgreSQL 数据库的结构?

mysql - MySQL 5 使用 JOIN 和 UNION 时出错

mysql - 由于查询而导致性能下降?

sql - sqlite fts 表中的 rowid 与 docid 有什么区别?

mysql - 在一个语句中合并两个 sql 查询

postgresql - 有人能解释一下为什么 Cassandra 写的比 postgres 快吗