sql >> Database >  >> RDS >> PostgreSQL

Operator bestaat niet:json =json

Kortom - gebruik JSONB in ​​plaats van JSON of cast JSON naar JSONB.

U kunt json-waarden niet vergelijken. U kunt in plaats daarvan tekstwaarden vergelijken:

SELECT * 
FROM movie_test 
WHERE tags::text = '["dramatic","women","political"]'

Merk echter op dat waarden van het type JSON worden opgeslagen als tekst in een formaat waarin ze worden gegeven. Het resultaat van de vergelijking hangt er dus van af of u consequent hetzelfde formaat toepast:

SELECT 
    '["dramatic" ,"women", "political"]'::json::text =  
    '["dramatic","women","political"]'::json::text      -- yields false!
    

In Postgres 9.4+ kun je dit probleem oplossen met het type JSONB, dat is opgeslagen in een ontleed binair formaat. Waarden van dit type kunnen worden vergeleken:

SELECT 
    '["dramatic" ,"women", "political"]'::jsonb =  
    '["dramatic","women","political"]'::jsonb           -- yields true

dus deze zoekopdracht is veel betrouwbaarder:

SELECT * 
FROM movie_test 
WHERE tags::jsonb = '["dramatic","women","political"]'::jsonb

Lees meer over JSON-typen.




  1. Een trigger maken die alleen wordt uitgevoerd wanneer een nieuwe tabel wordt gemaakt

  2. Upgrade PostgreSQL van 9.6 naar 10.0 op Ubuntu 16.10

  3. ~/.psqlrc bestand voor DBA's

  4. MariaDB RONDE() vs TRUNCATE()