PostgreSQL implementiert FULL OUTER JOIN
entweder mit einem Hash oder einem Merge-Join.
Um für einen solchen Join in Frage zu kommen, muss die Join-Bedingung die Form
haben<expression using only left table> <operator> <expression using only right table>
Jetzt erfüllt Ihre Join-Bedingung so aussehen, aber PostgreSQL hat keinen speziellen IS NOT DISTINCT FROM
Operator, also zerlegt er Ihre Bedingung in:
(NOT ($1 IS DISTINCT FROM $2))
Und ein solcher Ausdruck kann nicht für Hash- oder Merge-Joins verwendet werden, daher die Fehlermeldung.
Ich kann mir einen Weg vorstellen, das zu umgehen:
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;
Das funktioniert, wenn <null>
erscheint nirgendwo im value
Spalten.