检查不同的列或空结果 PostgreSQL

Checking for different columns OR empty result PostgreSQL

我正在为 dbt 编写一些查询测试,我想检查两个查询 return 是否相同,并且两者都不为空。由于它是一个 dbt 测试,如果这些条件中的任何一个为假,我需要 return 一行。到目前为止,我已经想出了以下内容:

with query1 as (
    select id from table1
),
query2 as (
    select id from table2
)
select
    case
        -- if either query returns 0 rows, return 1
        when not exists(select * from query1) OR not exists(select * from query2) then 1

        -- if both queries aren't empty, check for different columns and return their id's
        else COALESCE(query1.id, query2.id) END as id
from query1
FULL JOIN query2
    ON query1.id = query2.id
WHERE query1 IS NULL OR query2 IS NULL

理论上,如果任一查询为空,这应该 return 包含 1 的行,如果两者都不为空,则它应该 return 任何不属于两个查询的列。当只有 query1 为空或只有 query 2 为空时,这是有效的,但如果两者都是空的,那么它 return 是一个空的 table 而不是 1。我的直觉是它与 JOIN 有关,但我真的对 SQL 了解不够,无法弄清楚为什么这会影响原始查询。

编辑:添加示例

没有不同的行

query1:      query2:      result:
|  id   |   |  id   |    |  id   |
|-------|   |-------|    |-------|
|   1   |   |   3   |    |       |
|   3   |   |   1   |

不同行

query1:      query2:      result:
|  id   |   |  id   |    |  id   |
|-------|   |-------|    |-------|
|   1   |   |   4   |    |   3   |
|   3   |   |   1   |    |   4   |

或者table为空

query1:      query2:      result:
|  id   |   |  id   |    |  id   |
|-------|   |-------|    |-------|
|       |   |       |    |   1   |
|       |   |       |

我建议查询 returns 一个类似 0 的值,以防任何表为空,因为这可以与 [=13= 的有效 id 值区分开来].

因此,在这种情况下使用 UNION ALL 并检查 EXISTS 是否有任何表格为空:

WITH 
  query1 AS (SELECT id from table1),
  query2 AS (SELECT id from table2)
SELECT 0 id
WHERE (NOT EXISTS (SELECT 1 FROM query1)) OR (NOT EXISTS (SELECT 1 FROM query2))
UNION ALL
SELECT COALESCE(q1.id, q2.id) id
FROM query1 q1 FULL JOIN query2 q2
ON q2.id = q1.id
WHERE (q1.id IS NULL OR q2.id IS NULL)
  AND (EXISTS (SELECT 1 FROM query1)) AND (EXISTS (SELECT 1 FROM query2))

请注意,对于您发布的样本数据,您实际上并不需要 CTE,因为您可以 select 直接从表中获取。

参见demo