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
.