За съжаление няма лесен начин да направите директен 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
.