sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man grupperar/väljer JSON-typkolumn (PG::UndefinedFunction:ERROR:kunde inte identifiera en likhetsoperator för typen json)

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 .



  1. MySQL-tidsvärde i fråga 838:59:59?

  2. Välj det näst högsta lägsta värdet i Oracle

  3. Finns det någon gräns för den kommaavgränsade strängen i find_in_set i mysql-frågan

  4. Hur är Gmail-sökningen så snabb?