在jsonb键/值列表中查找值

时间:2017-07-20 13:56:55

标签: postgresql jsonb

我有一个城市的postgresql表(1行= 1个城市),其中jsonb列包含不同语言的城市名称(作为列表,而不是数组)。例如,对于巴黎(法国),我有:

id_city (integer)  = 7444
name_city (text)   = Paris
names_i18n (jsonb) = {"name:fr":"Paris","name:zh":"巴黎","name:it":"Parigi",...}

实际上,在我的桌子中,我有大约20种不同的语言。所以我试图找到一个城市寻找任何名称:xx的值可以匹配用户给出的参数,但我找不到如何以这种方式查询jsonb列。我尝试过类似下面的请求,但它似乎不是很好的语法

select * from jsonb_each_text(select names_i18n from CityTable)
where value ilike 'Parigi'

我也尝试了以下

select * from CityTable where names_i18n ? 'Parigi';

但它似乎仅适用于jsonb的关键部分,值部分是否有类似的运算符?我还需要一种方法来知道什么名字:XX已被发现,而不仅仅是城市名称。 有人有线索吗?

1 个答案:

答案 0 :(得分:1)

with CityTable (id_city, name_city, names_i18n) as (values(
    7444, 'Paris',
    '{"name:fr":"Paris","name:zh":"巴黎","name:it":"Parigi"}'::jsonb
))
select *
from CityTable, jsonb_each_text(names_i18n) jbet (key, value)
where value ilike 'Parigi'
;
 id_city | name_city |                          names_i18n                          |   key   | value  
---------+-----------+--------------------------------------------------------------+---------+--------
    7444 | Paris     | {"name:fr": "Paris", "name:it": "Parigi", "name:zh": "巴黎"} | name:it | Parigi