我有一个城市的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已被发现,而不仅仅是城市名称。 有人有线索吗?
答案 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