sql >> Database >  >> RDS >> PostgreSQL

Hoe een JSON-typekolom te groeperen/selecteren (PG::UndefinedFunctie:ERROR:kon geen gelijkheidsoperator identificeren voor type json)

Helaas is er geen eenvoudige manier om direct json te doen gelijkheidstests in 9.3.

9.3's json type heeft geen gelijkheidsoperator, omdat het json met dubbele sleutels accepteert (zoals veel implementaties verwachten). Het is niet duidelijk of {"a":1, "a":2} is "gelijk" aan {"a":1} of niet.

9.4 voegt jsonb toe die dubbele sleutels samenvouwt op een last-key-wins-basis, waardoor gelijkheid ondubbelzinnig wordt.

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)

Helaas betekent dit dat je niet zomaar kunt doen wat je wilt in 9.3.

U kunt een aangepaste operator voor gelijkheid schrijven voor json - misschien gewoon beide naar tekst casten en op die manier vergelijken, maar dat zou {"a":1, "b":2} behandelen en {"b":2, "a":1} als ongelijk.

Een betere optie zou zijn om PL/V8 te installeren en de json-bewerkingen van de V8 JavaScript-engine te gebruiken om de gelijkheidsvergelijking uit te voeren.

Definieer een gelijkheidsoperator voor json , definieer vervolgens een eenvoudige b-tree opklasse met behulp van die operator. Beide zijn eenvoudig te doen op SQL-niveau - zie CREATE OPERATOR en CREATE OPERATOR CLASS .

Zodra je dat hebt gedaan, kun je GROUP BY json-waarden in 9.3.

Of je kunt gewoon 9.4 beta1 installeren en jsonb . gebruiken .



  1. Waar kan ik het bestand my.ini voor de Windows mysql-server vinden?

  2. Hoe JPA-entiteiten vernieuwen wanneer de backend-database asynchroon verandert?

  3. Is een impasse mogelijk bij het bijwerken en verwijderen van verschillende rijen in een tabel?

  4. PreparedStatement en setTimestamp in oracle jdbc