Rất tiếc, không có cách đơn giản nào để thực hiện trực tiếp json
kiểm tra bình đẳng trong 9.3.
9.3 của json
kiểu không có toán tử bình đẳng, vì nó chấp nhận json với các khóa trùng lặp (như nhiều triển khai mong đợi). Không rõ là {"a":1, "a":2}
là "bằng" với {"a":1}
hoặc không.
9.4 thêm jsonb
điều này thu gọn các khóa trùng lặp trên cơ sở khóa cuối cùng giành chiến thắng, làm cho sự bình đẳng trở nên rõ ràng.
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)
Thật không may, điều này có nghĩa là bạn không thể làm những gì bạn muốn chỉ trong 9.3.
Bạn có thể viết toán tử bình đẳng tùy chỉnh cho json
- có lẽ chỉ truyền cả hai sang văn bản và so sánh theo cách đó, nhưng điều đó sẽ xử lý {"a":1, "b":2}
và {"b":2, "a":1}
như không bình đẳng.
Một lựa chọn tốt hơn sẽ là cài đặt PL / V8 và sử dụng các hoạt động json của động cơ JavaScript V8 để thực hiện so sánh bình đẳng.
Xác định toán tử bình đẳng cho json
, sau đó xác định một lớp b-cây đơn giản bằng cách sử dụng toán tử đó. Cả hai đều đơn giản để thực hiện ở cấp SQL - xem CREATE OPERATOR
và CREATE OPERATOR CLASS
.
Sau khi hoàn thành, bạn sẽ có thể GROUP BY
giá trị json trong 9.3.
Hoặc bạn có thể chỉ cần cài đặt 9.4 beta1 và sử dụng jsonb
.