PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Pourquoi PostgreSQL ne peut-il pas faire ce simple FULL JOIN ?

PostgreSQL implémente FULL OUTER JOIN avec un hachage ou une jointure par fusion.

Pour être éligible à une telle jointure, la condition de jointure doit avoir la forme

<expression using only left table> <operator> <expression using only right table>

Maintenant, votre condition de jointure fait ressemble à ceci, mais PostgreSQL n'a pas de IS NOT DISTINCT FROM spécial opérateur, donc il analyse votre condition en :

(NOT ($1 IS DISTINCT FROM $2))

Et une telle expression ne peut pas être utilisée pour les jointures de hachage ou de fusion, d'où le message d'erreur.

Je peux penser à un moyen de contourner ce problème :

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;

Cela fonctionne si <null> n'apparaît nulle part dans la value colonnes.