साधारण JSONs के लिए आप अधिक उपयुक्त क्वेरी का उपयोग कर सकते हैं जैसे
select *
from mytable t
where exists (
select 1
from jsonb_each_text(t.jsonbfield) j
where j.value = 'hello');
यह आपके उदाहरण की तरह JSON के लिए ठीक काम करता है लेकिन {"a":"hello","b":1,,"c":{"c":"world"}} जैसे अधिक जटिल JSON के लिए मदद नहीं करता है। /कोड>
मैं इस तरह से संग्रहीत फ़ंक्शन बनाने का प्रस्ताव कर सकता हूं
create or replace function jsonb_enum_values(in jsonb) returns setof varchar as $$
begin
case jsonb_typeof($1)
when 'object' then
return query select jsonb_enum_values(j.value) from jsonb_each($1) j;
when 'array' then
return query select jsonb_enum_values(a) from jsonb_array_elements($1) as a;
else
return next $1::varchar;
end case;
end
$$ language plpgsql immutable;
पुनरावर्ती वस्तुओं सहित सभी मूल्यों को सूचीबद्ध करने के लिए (यह आप पर निर्भर है कि सरणियों के साथ क्या करना है)।
यहां उपयोग का उदाहरण दिया गया है:
with t(x) as (
values
('{"a":"hello","b":"world","c":1,"d":{"e":"win","f":"amp"}}'::jsonb),
('{"a":"foo","b":"world","c":2}'),
('{"a":[{"b":"win"},{"c":"amp"},"hello"]}'),
('[{"a":"win"}]'),
('["win","amp"]'))
select *
from t
where exists (
select *
from jsonb_enum_values(t.x) j(x)
where j.x = '"win"');
ध्यान दें कि स्ट्रिंग मान के आस-पास दोहरे उद्धरण चिह्न हैं।