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
.