Tóm lại - sử dụng JSONB thay vì JSON hoặc truyền JSON thành JSONB.
Bạn không thể so sánh các giá trị json. Thay vào đó, bạn có thể so sánh các giá trị văn bản:
SELECT *
FROM movie_test
WHERE tags::text = '["dramatic","women","political"]'
Tuy nhiên, lưu ý rằng các giá trị của kiểu JSON được lưu trữ dưới dạng văn bản ở định dạng mà chúng được đưa ra. Do đó, kết quả so sánh phụ thuộc vào việc bạn có nhất quán áp dụng cùng một định dạng hay không:
SELECT
'["dramatic" ,"women", "political"]'::json::text =
'["dramatic","women","political"]'::json::text -- yields false!
Trong Postgres 9.4+, bạn có thể giải quyết vấn đề này bằng cách sử dụng loại JSONB, được lưu trữ ở định dạng nhị phân phân rã. Giá trị của loại này có thể được so sánh:
SELECT
'["dramatic" ,"women", "political"]'::jsonb =
'["dramatic","women","political"]'::jsonb -- yields true
vì vậy truy vấn này đáng tin cậy hơn nhiều:
SELECT *
FROM movie_test
WHERE tags::jsonb = '["dramatic","women","political"]'::jsonb
Đọc thêm về Các loại JSON.