sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan grupperes/vælges JSON type kolonne (PG::UndefinedFunction:FEJL:kunne ikke identificere en lighedsoperator for typen json)

Desværre er der ingen enkel måde at gøre direkte json på ligestillingstest i 9.3.

9.3's json type har ingen lighedsoperator, fordi den accepterer json med duplikerede nøgler (som mange implementeringer forventer). Det er ikke klart, om {"a":1, "a":2} er "lig" med {"a":1} eller ej.

9.4 tilføjer jsonb som kollapser dubletnøgler på en sidste-nøgle-vinder-basis, hvilket gør lighed utvetydig.

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)

Desværre betyder det, at du ikke kan gøre, hvad du vil blot i 9.3.

Du kan skrive en brugerdefineret lighedsoperator for json - måske bare caste både til tekst og sammenligne på den måde, men det ville behandle {"a":1, "b":2} og {"b":2, "a":1} som ulige.

En bedre mulighed ville være at installere PL/V8 og bruge V8 JavaScript-motorens json-operationer til at udføre lighedssammenligningen.

Definer en lighedsoperator for json , definer derefter en simpel b-træ opklasse ved hjælp af denne operator. Begge er enkle at gøre på SQL-niveau - se CREATE OPERATOR og CREATE OPERATOR CLASS .

Når du har gjort det, vil du være i stand til at GROUP BY json-værdier i 9.3.

Eller du kan bare installere 9.4 beta1 og bruge jsonb .



  1. PostgreSQL -skal vises i GROUP BY-sætningen eller bruges i en aggregeret funktion

  2. Postgres er den fedeste database – Årsag #2:Licensen

  3. Sådan opretter du pivottabel i MySQL

  4. Lagring af UUID som streng i mysql ved hjælp af JPA