PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Best Practice zum Identifizieren einer jsonb-Null in plpgsql

Beide Ihrer verknüpften Antworten enthalten Lösungen, aber es könnte gut sein, eine Sammelantwort zu haben.

Postgres ist stark typisiert. Seine Funktionen und Operatoren geben bestimmte Typen zurück.

-> gibt jsonb zurück. Vergleichen Sie es nicht mit SQL null, sondern mit jsonb null .

test=# select '{"i_am_null": null, "a_string": "null"}'::jsonb->'i_am_null' = 'null'::jsonb;
 ?column? 
----------
 t
(1 row)

test=# select '{"i_am_null": null, "a_string": "null"}'::jsonb->'a_string' = 'null'::jsonb;
 ?column? 
----------
 f
(1 row)

->> gibt Text zurück und wandelt jsonb null in SQL null um .

test=# select '{"i_am_null": null, "a_string": "null"}'::jsonb->>'i_am_null' is null;
 ?column? 
----------
 t
(1 row)

test=# select '{"i_am_null": null, "a_string": "null"}'::jsonb->>'a_string' is null;
 ?column? 
----------
 f
(1 row)

Beachten Sie, dass, während jsonb null nur ein weiterer Wert ist, SQL null etwas ganz Besonderes ist. Null ist kein Wert, es ist das Fehlen eines Wertes. Null ist gleich nichts, nicht einmal null . Es mag so aussehen, als ob das Casting von null in jsonb jsonb null erzeugen sollte, aber der SQL-Standard verlangt, dass null nur in null umgewandelt wird andernfalls würde das bedeuten, dass null äquivalent zu etwas ist.

Aus diesem Grund kann jsonb null in null konvertiert werden, aber null wird nicht in jsonb null umgewandelt. null::jsonb ist null . Dies ist umständlich, wird aber vom SQL-Standard gefordert. Dies ist einer der Gründe, warum das Hin- und Herwechseln zwischen jsonb und Text nicht empfohlen wird.