如果值为NULL,则左连接,否则为内部连接

时间:2019-01-16 02:31:22

标签: sql postgresql join

我想要两个表上的联接,如果值是NULL,则复制左联接行为,如果值不是NOT,则复制内部联接行为。例如,对于表:

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子句)。

1 个答案:

答案 0 :(得分:2)

您可以使用此:

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;