sql >> Databáze >  >> RDS >> PostgreSQL

Jak seskupit/vybrat sloupec typu JSON (PG::UndefinedFunction:ERROR:nelze identifikovat operátor rovnosti pro typ json)

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 .



  1. Měla by hibernace používat jedinečné sekvence pro každou tabulku?

  2. Jak importovat excelový soubor do MySQL Workbench?

  3. org.hibernate.ObjectDeletedException:smazaný objekt bude znovu uložen kaskádou (odstranit smazaný objekt z asociací)

  4. CREATE VIEW musí být jediným příkazem v dávce