这里有一些数据可以玩:
CREATE TABLE a (
a_id int NOT NULL,
a_prop text NOT NULL
);
CREATE TABLE b (
b_id int NOT NULL,
b_prop text NOT NULL
);
INSERT INTO a VALUES (1, 'blah'), (2, 'blah'), (4, 'not this one');
INSERT INTO b VALUES (1, 'blah'), (3, 'blah'), (5, 'not this one');
现在我想写一个返回的查询:
一种可能性是:
SELECT *
FROM a
FULL OUTER JOIN b ON a_id = b_id
WHERE (a_prop = 'blah' OR a_prop IS NULL)
AND (b_prop = 'blah' OR b_prop IS NULL);
这要求我为OR ... IS NULL
我有条件的每个领域都写。如果某些条件是日期范围等,这将变得更加冗长。
如果这是左连接:
SELECT *
FROM a
LEFT JOIN b ON a_id = b_id
WHERE a_prop = 'blah'
AND (b_prop = 'blah' OR b_prop IS NULL);
我可以将条件移至ON
子句以避免这种情况:
SELECT *
FROM a
LEFT JOIN b ON a_id = b_id AND b_prop = 'blah'
WHERE a_prop = 'blah';
有没有办法用完整的外部连接来做到这一点?
col = 'x' OR col IS NULL
原来的:
使用
col <> x IS NOT TRUE
:或加入前过滤:
col <> 'x' OR col IS NULL
问题的第一个版本要求这个谓词。
原来的:
使用
col IS DISTINCT FROM 'x'
:或加入前过滤:
db<>fiddle here - 显示所有
旁白:而不是
!=
我使用<>
,这是 SQL 中的标准运算符。(!=
是 Postgres 中公认的别名。)另外的选择:
db<>小提琴