sql >> Databáze >  >> RDS >> PostgreSQL

Nejlepší postup pro identifikaci jsonb null v plpgsql

Obě vaše propojené odpovědi obsahují řešení, ale může být dobré mít omnibusovou odpověď.

Postgres je silně typizovaný. Jeho funkce a operátory vracejí specifické typy.

-> vrátí jsonb. Porovnejte to nikoli s SQL null, ale 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)

->> vrátí text a převede jsonb null na SQL null .

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)

Všimněte si, že zatímco jsonb null je jen další hodnota, SQL null je velmi speciální. Null není hodnota, je to nedostatek hodnoty. Null nerovná se nic, dokonce ani null . Mohlo by se zdát, že přetypování null do jsonb by mělo produkovat jsonb null, ale standard SQL vyžaduje, aby null přetypoval pouze na null jinak by to znamenalo, že null je ekvivalentní něčemu.

To je důvod, proč lze jsonb null převést na null, ale null není přetypováno na jsonb null. null::jsonb je null . To je nepohodlné, ale vyžaduje to standard SQL. Je to jeden z důvodů, proč se přehazování tam a zpět mezi jsonb a text nedoporučuje.



  1. Funkce plpgsql:Vrací řádky z pohledu vytvořeného z náhodné tabulky

  2. Jak funguje CONVERT_TZ() v MariaDB

  3. Jak definujete postgresové funkce v Rails a jaký je jejich rozsah a životnost?

  4. PIVOT dotaz na odlišné záznamy