Tyvärr finns det inget enkelt sätt att göra direkt json jämställdhetstest i 9.3.
9.3:s json type har ingen likhetsoperator, eftersom den accepterar json med dubbletter av nycklar (som många implementeringar förväntar sig). Det är inte klart om {"a":1, "a":2} är "lika" med {"a":1} eller inte.
9.4 lägger till jsonb som kollapsar dubbletter av nycklar på en sista-nyckel-vinn-basis, vilket gör jämlikhet entydig.
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)
Tyvärr betyder detta att du inte kan göra vad du vill helt enkelt i 9.3.
Du kan skriva en anpassad likhetsoperator för json - kanske bara casta både till text och jämföra på det sättet, men det skulle behandla {"a":1, "b":2} och {"b":2, "a":1} som ojämlika.
Ett bättre alternativ skulle vara att installera PL/V8 och använda V8 JavaScript-motorns json-operationer för att utföra jämställdhetsjämförelsen.
Definiera en likhetsoperator för json , definiera sedan en enkel b-tree opklass med den operatorn. Båda är enkla att göra på SQL-nivå - se CREATE OPERATOR och CREATE OPERATOR CLASS .
När du har gjort det kommer du att kunna GROUP BY json-värden i 9.3.
Eller så kan du bara installera 9.4 beta1 och använda jsonb .