sql >> Databasteknik >  >> RDS >> PostgreSQL

Operatören finns inte:json =json

Kort sagt - använd JSONB istället för JSON eller casta JSON till JSONB.

Du kan inte jämföra json-värden. Du kan jämföra textvärden istället:

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

Observera dock att värden av typen JSON lagras som text i ett format som de är givna i. Resultatet av jämförelsen beror alltså på om du konsekvent använder samma format:

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

I Postgres 9.4+ kan du lösa detta problem med typen JSONB, som lagras i ett sönderdelat binärt format. Värden av denna typ kan jämföras:

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

så den här frågan är mycket mer tillförlitlig:

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

Läs mer om JSON-typer.




  1. FEL 1045 (28000):Åtkomst nekad för användaren 'root'@'localhost' (med lösenord:JA)

  2. Finns det några nackdelar med att alltid använda nvarchar(MAX)?

  3. Division ( / ) ger inte mitt svar i postgresql

  4. 4 sätt att lista vyerna i en SQLite-databas