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 .