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
.