PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да групирате/изберете колона тип JSON (PG::UndefinedFunction:ГРЕШКА:не може да идентифицира оператор за равенство за тип json)

За съжаление няма лесен начин да направите директен json тестове за равенство в 9.3.

json на 9.3 type няма оператор за равенство, защото приема json с дублиращи се ключове (както много реализации очакват). Не е ясно дали {"a":1, "a":2} е "равно" на {"a":1} или не.

9.4 добавя jsonb който свива дублиращите се ключове на базата на последния ключ, което прави равенството недвусмислено.

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)

За съжаление, това означава, че не можете да правите това, което искате, просто в 9.3.

Можете да напишете персонализиран оператор за равенство за json - може би просто прехвърляне на двете към текст и сравняване по този начин, но това би третирало {"a":1, "b":2} и {"b":2, "a":1} като неравен.

По-добър вариант би бил да инсталирате PL/V8 и да използвате json операциите на V8 JavaScript двигателя, за да извършите сравнението на равенството.

Дефинирайте оператор за равенство за json , след това дефинирайте прост opclass на b-дърво, като използвате този оператор. И двете са лесни за изпълнение на ниво SQL - вижте CREATE OPERATOR и CREATE OPERATOR CLASS .

След като го направите, ще можете да GROUP BY json стойности в 9.3.

Или можете просто да инсталирате 9.4 beta1 и да използвате jsonb .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извличане на последната известна стойност за всяка колона от ред

  2. Грешка при създаването на пространствена база данни с помощта на EXTENSIONS

  3. Erlang и PostgreSQL

  4. Как мога безопасно да препратя поредица от първичен ключ в Django?

  5. Rails/ActiveRecord Групиране по месец+година с преброяване