首页 > 解决方案 > 如果值为 NULL,则左连接,否则为内连接

问题描述

我想在两个表上进行连接,如果值为 NULL,则复制左连接行为,如果值为 NOT NULL,则复制内连接行为。例如,对于表:

t1(val) AS (VALUES (NULL)),
t2(val) AS (VALUES ('a'), ('b'))

联接将返回带有值的单行(NULL,NULL)(根据左联接)。对于表格:

t1(val) AS (VALUES ('c')),
t2(val) AS (VALUES ('a'), ('b'))

不会返回任何行(根据内部连接)。对于表格:

t1(val) AS (VALUES ('a')),
t2(val) AS (VALUES ('a'), ('b'))

将返回带有值的单行('a','a')(根据任一类型的连接)。

最有效的方法是什么?

编辑:作为最大化效率的一部分,我正在寻找一个不进行后过滤的查询(即使用WHERE子句)。

标签: sqlpostgresqljoin

解决方案


你可以使用这个:

SELECT t1.val, t2.val
FROM t1
LEFT JOIN t2
ON t1.val = t2.val 
WHERE t1.val IS NULL OR t1.val = t2.val;

或者:

SELECT NULL AS val1, NULL AS val2
FROM t1 
WHERE val IS NULL 
UNION ALL 
SELECT t2.val, t2.val 
FROM t2
INNER JOIN t1 ON t1.val = t2.val;

推荐阅读