2016-03-27 15 views
0

jsonb alanındaki herhangi bir numaralı anahtarın nerede olursa olsun bir metin içerdiği tüm kayıtları almak istiyorum.Sorgu, değerden bağımsız olarak jsonb değerini jsonb

Örneğin: alan json {k1: 'hello', k2: 'world'} içerir. Bu kaydı 'merhaba' metniyle almak istiyorum. Anahtarlar ya da herhangi bir json yapısı, sadece değerler umrumda değil.

Bir kirli kesmek, alanı varchar where jsonb_field::varchar like ...'a yayınlamaktır, ancak bu çirkindir ve anahtarlarla ve {} ile eşleşecektir.

SELECT * FROM mytable AS m1 WHERE (
    SELECT string_agg(value, '') FROM jsonb_each_text((SELECT name FROM mytable AS m2 WHERE m1.id= m2.id)::jsonb) 
) LIKE '%whatever%'; 

ama çok çirkin:

başka kirli kesmek buna benzemez.

Bunu nasıl yapabilirim?

cevap

2

Ben saklanan oluşturmak için teklif edebilirsiniz basit JSONs için, Bu sizin örnekte olduğu gibi JSONs için çalışıyor

select * 
from mytable t 
where exists (
    select 1 
    from jsonb_each_text(t.jsonbfield) j 
    where j.value = 'hello'); 

gibi daha uygun sorgusu kullanabilirsiniz fakat {"a":"hello","b":1,"c":{"c":"world"}}

gibi daha karmaşık JSONs için yardımcı olur

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; 

gibi işlev özyinelemeli nesneler (O diziler ile ne size kalmış) dahil tüm değerleri listelemek için. dize değeri etrafında doublequotes

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"'); 

Not: Burada

kullanım örneğidir.

+0

Jsonumda bir dizi değeri varsa, başarısız oluyor. –

+0

@DeepakKumarPadhy İlginiz için teşekkürler. İşlev ve örnek güncellendi. – Abelisto

+0

Kayıtlı proc'm benim problemim için çalışacağım gibi düştüm (http://stackoverflow.com/questions/43252423/searching-for-a-particular-value-in-a-jsonb-datatype-prostgresql). Bunun en uygun yol olup olmadığından emin değilim, sorunum için herhangi bir öneri. –

İlgili konular