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

L'opérateur n'existe pas :json =json

En bref - utilisez JSONB au lieu de JSON ou convertissez JSON en JSONB.

Vous ne pouvez pas comparer les valeurs json. Vous pouvez comparer les valeurs textuelles à la place :

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

Notez cependant que les valeurs de type JSON sont stockées sous forme de texte dans un format dans lequel elles sont données. Ainsi, le résultat de la comparaison dépend si vous appliquez systématiquement le même format :

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

Dans Postgres 9.4+, vous pouvez résoudre ce problème en utilisant le type JSONB, qui est stocké dans un format binaire décomposé. Les valeurs de ce type peuvent être comparées :

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

donc cette requête est beaucoup plus fiable :

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

En savoir plus sur les types JSON.