PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara mengelompokkan/memilih kolom tipe JSON (PG::UndefinedFunction:ERROR:tidak dapat mengidentifikasi operator kesetaraan untuk tipe json)

Sayangnya tidak ada cara sederhana untuk melakukan json langsung tes kesetaraan di 9.3.

9.3 json type tidak memiliki operator kesetaraan, karena ia menerima json dengan kunci duplikat (seperti yang diharapkan oleh banyak implementasi). Tidak jelas apakah {"a":1, "a":2} adalah "sama" dengan {"a":1} atau tidak.

9.4 menambahkan jsonb yang menciutkan kunci duplikat dengan basis last-key-wins, membuat kesetaraan menjadi tidak ambigu.

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)

Sayangnya, ini berarti Anda tidak dapat melakukan apa yang Anda inginkan hanya di 9.3.

Anda dapat menulis operator kesetaraan khusus untuk json - mungkin hanya mentransmisikan keduanya ke teks dan membandingkannya seperti itu, tetapi itu akan memperlakukan {"a":1, "b":2} dan {"b":2, "a":1} sebagai tidak setara.

Pilihan yang lebih baik adalah menginstal PL/V8 dan menggunakan operasi json mesin JavaScript V8 untuk melakukan perbandingan kesetaraan.

Tentukan operator kesetaraan untuk json , lalu definisikan opclass b-tree sederhana menggunakan operator tersebut. Keduanya mudah dilakukan di tingkat SQL - lihat CREATE OPERATOR dan CREATE OPERATOR CLASS .

Setelah melakukannya, Anda dapat GROUP BY nilai json di 9.3.

Atau Anda bisa menginstal 9.4 beta1 dan menggunakan 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. Apakah mungkin untuk melewatkan refcursor sebagai parameter langsung ke FETCH di Npgsql?

  2. Postgres di Rails FATAL:database tidak ada

  3. Bagaimana cara menangani nilai opsional yang dikembalikan oleh kueri menggunakan peti postgres?

  4. Menggunakan nilai parameter untuk skema dan tabel di Postgresql

  5. Rails:Cara membuat kolom waktu dengan zona waktu di postgres