ОШИБКА: оператор не существует: jsonb [] -> целое число - PullRequest
2 голосов
/ 23 марта 2019
select id,rules from links where id=2;
 id |                                                                                   rules                                                                                   
----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  2 | {"{\"id\": \"61979e81-823b-419b-a577-e2acb34a2f40\", \"url\": \"https://www.wikijob.co.uk/about-us\", \"what\": \"country\", \"matches\": \"GB\", \"percentage\": null}"}

Я пытаюсь получить элементы jsonb, используя операторы здесь https://www.postgresql.org/docs/9.6/functions-json.html

Использую ли я 'url' или целое число, как показано ниже, я получаю аналогичный результат.

select id,rules->1 from links where id=2;
ERROR:  operator does not exist: jsonb[] -> integer
LINE 1: select id,rules->1 from links where id=2;
                       ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

Что я делаю не так?

PS Postgres версия 9.6.12.

1 Ответ

2 голосов
/ 23 марта 2019

Столбец является массивом, вы можете получить доступ к первому элементу, используя индекс:

select id, rules[1]
from links
where id = 2

Обязательно проверьте также этот ответ.

Используйте jsonb_each() в боковом соединении, чтобы увидеть все правила в отдельных строках:

select id, key, value
from links
cross join jsonb_each(rules[1]) as rule(key, value)
where id = 2

Вы можете получить одно правило следующим образом:

select id, value as url
from links
cross join jsonb_each(rules[1]) as rule(key, value)
where id = 2 and key = 'url'

Используйте unnest(), чтобы найти url во всех элементах массива, например ::

select id, unnest(rules)->'url' as url
from links
where id = 2;
...