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.
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 .