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
.