PostgreSQL implementerar FULL OUTER JOIN
med antingen en hash eller en sammanfogning.
För att vara berättigad till en sådan anslutning måste anslutningsvillkoret ha formuläret
<expression using only left table> <operator> <expression using only right table>
Nu gör ditt anslutningsvillkor ser ut så här, men PostgreSQL har inte en speciell IS NOT DISTINCT FROM
operatorn, så den analyserar ditt tillstånd till:
(NOT ($1 IS DISTINCT FROM $2))
Och ett sådant uttryck kan inte användas för hash eller merge joins, därav felmeddelandet.
Jag kan komma på ett sätt att komma runt det:
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;
Det fungerar om <null>
visas inte någonstans i value
kolumner.