Niestety nie ma prostego sposobu na wykonanie bezpośredniego json testy równości w 9.3.
json 9.3 type nie ma operatora równości, ponieważ akceptuje json ze zduplikowanymi kluczami (jak oczekuje wiele implementacji). Nie jest jasne, czy {"a":1, "a":2} jest "równe" {"a":1} czy nie.
9.4 dodaje jsonb który zwija zduplikowane klucze na zasadzie „ostatni klucz-wygrywa”, dzięki czemu równość jest jednoznaczna.
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)
Niestety oznacza to, że w wersji 9.3 nie możesz robić tego, co chcesz.
Możesz napisać niestandardowy operator równości dla json - być może po prostu rzutuj zarówno na tekst, jak i porównując w ten sposób, ale to by potraktowało {"a":1, "b":2} i {"b":2, "a":1} jako nierówne.
Lepszą opcją byłoby zainstalowanie PL/V8 i użycie operacji json silnika JavaScript V8 do wykonania porównania równości.
Zdefiniuj operator równości dla json , a następnie zdefiniuj prostą opklasę b-drzewa przy użyciu tego operatora. Oba są proste do wykonania na poziomie SQL - zobacz CREATE OPERATOR i CREATE OPERATOR CLASS .
Gdy to zrobisz, będziesz mógł GROUP BY wartości json w 9.3.
Możesz też po prostu zainstalować wersję 9.4 beta1 i użyć jsonb .