PostgreSQL implementa FULL OUTER JOIN
ya sea con un hash o una combinación de combinación.
Para ser elegible para dicha unión, la condición de unión debe tener la forma
<expression using only left table> <operator> <expression using only right table>
Ahora su condición de unión sí se ve así, pero PostgreSQL no tiene un IS NOT DISTINCT FROM
especial operador, por lo que analiza su condición en:
(NOT ($1 IS DISTINCT FROM $2))
Y dicha expresión no se puede usar para combinaciones hash o merge, de ahí el mensaje de error.
Se me ocurre una forma de evitarlo:
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;
Eso funciona si <null>
no aparece en ninguna parte del value
columnas.