Bohužel neexistuje žádný jednoduchý způsob, jak přímo provést json testy rovnosti v 9.3.
9.3 json typ nemá žádný operátor rovnosti, protože přijímá json s duplicitními klíči (jak mnoho implementací očekává). Není jasné, zda {"a":1, "a":2} je "rovná se" {"a":1} nebo ne.
9.4 přidává jsonb který sbalí duplicitní klíče na základě posledního klíče, díky kterému je rovnost jednoznačná.
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)
Bohužel to znamená, že v 9.3 nemůžete jednoduše dělat to, co chcete.
Můžete napsat vlastní operátor rovnosti pro json - možná jen přetypování obou do textu a porovnání tímto způsobem, ale to by zacházelo s {"a":1, "b":2} a {"b":2, "a":1} jako nerovné.
Lepší možností by bylo nainstalovat PL/V8 a k provedení porovnání rovnosti použít operace json enginu JavaScriptu V8.
Definujte operátor rovnosti pro json , pak pomocí tohoto operátoru definujte jednoduchou opclass b-stromu. Obojí je na úrovni SQL jednoduché – viz CREATE OPERATOR a CREATE OPERATOR CLASS .
Jakmile to uděláte, budete moci GROUP BY hodnoty json v 9.3.
Nebo můžete nainstalovat 9.4 beta1 a použít jsonb .