PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak pogrupować/wybrać kolumnę typu JSON (PG::UndefinedFunction:ERROR:nie można zidentyfikować operatora równości dla typu json)

Niestety nie ma prostego sposobu na wykonanie bezpośredniego json testy równości w 9.3.

json 9.3 type nie ma operatora równości, ponieważ akceptuje json ze zduplikowanymi kluczami (jak oczekuje wiele implementacji). Nie jest jasne, czy {"a":1, "a":2} jest "równe" {"a":1} czy nie.

9.4 dodaje jsonb który zwija zduplikowane klucze na zasadzie „ostatni klucz-wygrywa”, dzięki czemu równość jest jednoznaczna.

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)

Niestety oznacza to, że w wersji 9.3 nie możesz robić tego, co chcesz.

Możesz napisać niestandardowy operator równości dla json - być może po prostu rzutuj zarówno na tekst, jak i porównując w ten sposób, ale to by potraktowało {"a":1, "b":2} i {"b":2, "a":1} jako nierówne.

Lepszą opcją byłoby zainstalowanie PL/V8 i użycie operacji json silnika JavaScript V8 do wykonania porównania równości.

Zdefiniuj operator równości dla json , a następnie zdefiniuj prostą opklasę b-drzewa przy użyciu tego operatora. Oba są proste do wykonania na poziomie SQL - zobacz CREATE OPERATOR i CREATE OPERATOR CLASS .

Gdy to zrobisz, będziesz mógł GROUP BY wartości json w 9.3.

Możesz też po prostu zainstalować wersję 9.4 beta1 i użyć 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. Dobry dostawca OleDB/ODBC dla PostgreSQL

  2. PostgreSQL JDBC getGeneratedKeys zwraca wszystkie kolumny

  3. Jak korzystać z wyzwalaczy PostgreSQL?

  4. O korzyściach z posortowanych ścieżek

  5. Odpowiednie wartości dla -Infinity &Infinity w Postgres