web-dev-qa-db-fra.com

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

quand j'essaie de sélectionner un enregistrement dans une table

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

Le code SQL a généré une erreur

LINE 1: SELECT * FROM movie_test WHERE tags = ('["dramatic","women",...
                                        ^
HINT:  No operator matches the given name and argument type(s). You might      need to add explicit type casts.

********** 错误 **********

ERROR: operator does not exist: json = json
SQL 状态: 42883
指导建议:No operator matches the given name and argument type(s). You might need to add explicit type casts.
字符:37

Ai-je oublié quelque chose ou où je peux apprendre quelque chose sur cette erreur.

18
Isaac

Vous ne pouvez pas comparer les valeurs json. Vous pouvez comparer des valeurs de texte à 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 de l'application constante du 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 Types JSON .

24
klin