Như thông báo lỗi cho biết, các đối số cho WHERE
không được trả lại một tập hợp. jsonb_array_elements
trả về một tập hợp và nó không thể được so sánh với một giá trị duy nhất. Trong truy vấn thứ hai, bạn có một phép nối chéo bên trong vùng chọn và điều đó sẽ chuyển nó thành một kết quả phù hợp để sử dụng WHERE
trên.
Bạn cũng có thể làm theo cách này
SELECT mydata.pk FROM mydata
WHERE 'Bob' in (SELECT jsonb_array_elements(mydata.data->'people')->>'name');
Tại đây, lựa chọn con sẽ cho phép bạn sử dụng IN
toán tử để tìm giá trị mong muốn vì kết quả không còn là một tập hợp.
Một cách khác là truy vấn jsonb trực tiếp
SELECT mydata.pk FROM mydata
WHERE mydata.data->'people' @> '[{"name":"Bob"}]'::jsonb;
Bằng cách này, bạn không cần chuyển jsonb thành tập kết quả và tìm kiếm trong tập hợp đó.