Многоуровневый поиск в PostgreSQL в формате JSON - PullRequest
0 голосов
/ 11 мая 2018

Вопрос в том, как искать (используя оператор LIKE) многоуровневый столбец JSON в PostgreSQL.

Я хочу выполнить поиск по name, который находится в en или на любом другом языке, который поддерживается в столбце.

Таблица:

table example

places
-------

id                     ascii_name                    translations

dsrsfdsf               be-namor		    { "en":{"locale":"en","name":"Namur"},"de":{"locale":"de","name":"Namur"},"bg":{"locale":"bg","name":"Намюр"} }
s3drs2es	       be-mouscron          { "en":{"locale":"en","name":"Mouscron"},"pl":{"locale":"pl","name":"Mouscron"},"de":{"locale":"de","name":"Mouscron"} }

Я только что нашел способ использования json_object_keys, но он вызывает ошибку, из-за которой я не могу использовать функцию возврата набора в операторе WHERE.

SELECT * FROM places p WHERE p.translations->json_object_keys(p.translations)->'name' LIKE '%Namur%'

Ошибка:

[0A000] ОШИБКА: функции возврата набора не разрешены в WHERE

Заранее спасибо!

1 Ответ

0 голосов
/ 11 мая 2018
so=# with c(j) as (values
 ('{ "en":{"locale":"en","name":"Namur"},"de":{"locale":"de","name":"Namur"},"bg":{"locale":"bg","name":"Намюр"} }'::json)
,('{ "en":{"locale":"en","name":"Mouscron"},"pl":{"locale":"pl","name":"Mouscron"},"de":{"locale":"de","name":"Mouscron"} }')
)
, filter as (select j,j->json_object_keys(j)->>'name' like '%amur%' as "found" from c)
select distinct j::jsonb from filter where found;
                                                              j
-----------------------------------------------------------------------------------------------------------------------------
 {"bg": {"name": "Намюр", "locale": "bg"}, "de": {"name": "Namur", "locale": "de"}, "en": {"name": "Namur", "locale": "en"}}
(1 row)

не возражаю, я бросил json в jsonb, чтобы отфильтровать обманщиков

...