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
.