Không có jsonb
được tích hợp sẵn các toán tử cũng như bất kỳ chỉ mục nào hỗ trợ trực tiếp loại bộ lọc này (chưa).
Tôi đề nghị một EXISTS
bán tham gia:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
Nó tránh các đánh giá thừa và DISTINCT
cuối cùng bước bạn cần để có được các hàng riêng biệt với CROSS JOIN
đơn giản .
Nếu điều này vẫn chưa đủ nhanh, một giải pháp chuyên biệt phức tạp hơn cho loại truy vấn nhất định sẽ là trích xuất một chuỗi liên kết của các giá trị duy nhất (với dấu phân cách sẽ không ảnh hưởng đến các mẫu tìm kiếm của bạn) trên mỗi hàng trong dấu IMMUTABLE
, xây dựng chỉ mục GIN trigram trên biểu thức hàm và sử dụng cùng một biểu thức trong các truy vấn của bạn.
Có liên quan:
- Tìm kiếm các giá trị lồng nhau trong mảng jsonb với toán tử lớn hơn
- Tìm các hàng có chứa khóa trong mảng bản ghi JSONB
- Tạo chỉ mục JSONB của Postgres trên đối tượng con của mảng
Ngoài ra, nếu jsonb
của bạn các giá trị thực sự giống như ví dụ, bạn có thể loại bỏ nhiều nhiễu và chỉ cần lưu trữ:
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]