Postgresql Поиск значения в объекте jsonb - PullRequest
0 голосов
/ 02 марта 2020

У меня есть поле jsonb в таблице, имеющее значения вида

    {
  "message": {
    "sender": {
      "from": "91**********"
    },
    "channel": "some kind of text",
    "content": {
      "text": "some kind of text",
      "type": "text"
    },
    "recipient": {
      "to": "91**********",
      "recipient_type": "some kind of text"
    },
    "preferences": {
      "webHookDNId": "some kind of text"
    }
  },
  "metaData": {
    "version": "some kind of text"
  }
}

Теперь я хочу найти все такие значения, которые в ключе "to" объекта имеют определенный номер телефона. Я использую следующий запрос для этого, но он не работает

select * from table_name where (column1::jsonb ? '91**********') ;

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

? ищет ключ верхнего уровня. JSON, который вы показываете, имеет только две клавиши верхнего уровня, "message" и "metadata". Поэтому, конечно, они не совпадают с '91 ********** '.

Возможно, вам нужен оператор удержания @>:

 @> '{"message":{"recipient":{"to":"91**********"}}}'

Это будет поддерживаться любым типом индекса JSONB GIN в вашем столбце.

0 голосов
/ 02 марта 2020

Вы можете использовать операторы -> и ->> для извлечения значения из ключа:

select *
from the_table
where (the_column -> 'recipient' ->> 'to') = '91**********';

Или оператор #>>

select *
from the_table
where the_column #>> '{recipient,to}' = '91**********';
...