在 Postgres JOIN 查询中区分 null 和 empty
Differentiate null and empty in Postgres JOIN query
如果我有这样的表:
t1:
id | name
----+------
1 | a
2 | b
3 | c
4 | d
t2:
id | value
----+-------
10 | xxx
20 | yyy
30 | zzz
t_join:
t1_id | t2_id
-------+-------
1 | 10
2 | 20
3 | 30
SELECT 查询 t1.id=1 看起来像:
SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=1;
当然还有 returns:
id | name | value
----+------+-------
1 | a | xxx
如果我用 id=4
做同样的事情,我什么也得不到。
SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=4;
id | name | value
----+------+-------
(0 rows)
而且,如果我用废话做同样的事情id=1234132
,我也一无所获。
SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=1234132;
id | name | value
----+------+-------
(0 rows)
有什么方法可以区分空结果 (id=4
) 和空结果 (id=1234132
)?我想我想在没有单独查询的情况下验证我正在检查的 ID 是否存在。这可能吗?
怎么样 left join
:
SELECT t1.id, t1.name, t2.value
FROM t1 LEFT JOIN
t_join
ON t1.id = t_join.t1_id LEFT JOIN
t2
ON t2.id = t_join.t2_id
WHERE t1.id = 1;
如果未找到 t.id
,您将不会获得任何行。如果 t2
中没有匹配项,那么您将获得 NULL
值。
还有一个简单的规则:永远不要在FROM
子句中使用逗号。 总是,总是使用正确、明确的JOIN
语法。
如果我有这样的表:
t1:
id | name
----+------
1 | a
2 | b
3 | c
4 | d
t2:
id | value
----+-------
10 | xxx
20 | yyy
30 | zzz
t_join:
t1_id | t2_id
-------+-------
1 | 10
2 | 20
3 | 30
SELECT 查询 t1.id=1 看起来像:
SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=1;
当然还有 returns:
id | name | value
----+------+-------
1 | a | xxx
如果我用 id=4
做同样的事情,我什么也得不到。
SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=4;
id | name | value
----+------+-------
(0 rows)
而且,如果我用废话做同样的事情id=1234132
,我也一无所获。
SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=1234132;
id | name | value
----+------+-------
(0 rows)
有什么方法可以区分空结果 (id=4
) 和空结果 (id=1234132
)?我想我想在没有单独查询的情况下验证我正在检查的 ID 是否存在。这可能吗?
怎么样 left join
:
SELECT t1.id, t1.name, t2.value
FROM t1 LEFT JOIN
t_join
ON t1.id = t_join.t1_id LEFT JOIN
t2
ON t2.id = t_join.t2_id
WHERE t1.id = 1;
如果未找到 t.id
,您将不会获得任何行。如果 t2
中没有匹配项,那么您将获得 NULL
值。
还有一个简单的规则:永远不要在FROM
子句中使用逗号。 总是,总是使用正确、明确的JOIN
语法。