PostgreSQL triển khai FULL OUTER JOIN
với hàm băm hoặc phép hợp nhất.
Để đủ điều kiện tham gia như vậy, điều kiện tham gia phải có dạng
<expression using only left table> <operator> <expression using only right table>
Bây giờ, điều kiện tham gia của bạn không trông giống như thế này, nhưng PostgreSQL không có IS NOT DISTINCT FROM
toán tử, vì vậy nó phân tích điều kiện của bạn thành:
(NOT ($1 IS DISTINCT FROM $2))
Và một biểu thức như vậy không thể được sử dụng cho các phép nối băm hoặc hợp nhất, do đó có thông báo lỗi.
Tôi có thể nghĩ ra một cách để giải quyết vấn đề đó:
SELECT a_id, NULLIF(a_value, '<null>'),
b_id, NULLIF(b_value, '<null>')
FROM (SELECT id AS a_id,
COALESCE(value, '<null>') AS a_value
FROM a
) x
FULL JOIN
(SELECT id AS b_id,
COALESCE(value, '<null>') AS b_value
FROM b
) y
ON x.a_value = y.b_value;
Điều đó hoạt động nếu <null>
không xuất hiện ở bất kỳ đâu trong giá trị value
cột.