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

Comment regrouper/sélectionner une colonne de type JSON (PG ::UndefinedFunction :ERREUR :impossible d'identifier un opérateur d'égalité pour le type json)

Malheureusement, il n'y a pas de moyen simple de faire directement json tests d'égalité en 9.3.

json de 9.3 type n'a pas d'opérateur d'égalité, car il accepte json avec des clés en double (comme de nombreuses implémentations l'attendent). Il n'est pas clair si {"a":1, "a":2} est "égal" à {"a":1} ou pas.

9.4 ajoute jsonb qui réduit les clés en double sur la base de la dernière clé gagnante, ce qui rend l'égalité sans ambiguïté.

regress=# SELECT '{"a":1, "a":2}'::json = '{"a":1}'::json;
ERROR:  operator does not exist: json = json
LINE 1: SELECT '{"a":1, "a":2}'::json = '{"a":1}'::json;
                                      ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

regress=# SELECT '{"a":1, "a":2}'::jsonb = '{"a":1}'::jsonb;
 ?column? 
----------
 f
(1 row)

Malheureusement, cela signifie que vous ne pouvez pas faire ce que vous voulez simplement dans 9.3.

Vous pouvez écrire un opérateur d'égalité personnalisé pour json - peut-être simplement convertir les deux en texte et comparer de cette façon, mais cela traiterait {"a":1, "b":2} et {"b":2, "a":1} comme inégal.

Une meilleure option serait d'installer PL/V8 et d'utiliser les opérations json du moteur JavaScript V8 pour effectuer la comparaison d'égalité.

Définir un opérateur d'égalité pour json , puis définissez une simple classe d'opérations b-tree à l'aide de cet opérateur. Les deux sont simples à faire au niveau SQL - voir CREATE OPERATOR et CREATE OPERATOR CLASS .

Une fois que vous avez fait cela, vous pourrez GROUP BY valeurs json dans 9.3.

Ou vous pouvez simplement installer 9.4 beta1 et utiliser jsonb .