Поиск значения внутри массива в jsonb - PullRequest
1 голос
/ 08 июля 2020

Если у меня есть объект jsonb, подобный этому:

{
  "eligibility": true,
  "dates_of_births": [
    [
      "2010-08-12",
      {
        "last_name": "abcd",
        "first_name": "efgh"
      }
    ],
    [
      "2009-08-12",
      {
        "last_name": "xyz",
        "first_name": "str"
      }
    ]
  ]
}

Как я могу запросить кого-либо с заданным c именем или dob? По сути, как я могу искать значения внутри

Спасибо за помощь. Прошу прощения за ужасную структуру объектов, но она была установлена ​​задолго до того, как я начал работу над этим проектом.

1 Ответ

2 голосов
/ 09 июля 2020

Вы можете присоединить свою таблицу к набору из jsonb_array_elements(jsdata->'dates_of_births'), а затем отфильтровать желаемое имя или дату рождения с помощью оператора @>, , который проверяет, содержит ли левое значение JSON right JSON записи пути / значения на верхнем уровне ,

и добавить операторы ->>, чтобы извлечь соответствующие значения для ключей или индексов в списке SELECT, например:

SELECT j.value ->> 0 AS "DOB", 
      (j.value ->> 1)::jsonb ->> 'first_name' AS "First Name",
      (j.value ->> 1)::jsonb ->> 'last_name' AS "Last Name"
  FROM t
 CROSS JOIN jsonb_array_elements(jsdata->'dates_of_births') AS j 
 WHERE j @> '[{"first_name": "efgh"}]'::jsonb

ИЛИ

SELECT j.value ->> 0 AS "DOB", 
      (j.value ->> 1)::jsonb ->> 'first_name' AS "First Name",
      (j.value ->> 1)::jsonb ->> 'last_name' AS "Last Name"
  FROM t
 CROSS JOIN jsonb_array_elements(jsdata->'dates_of_births') AS j 
 WHERE j @> '["2009-08-12"]'::jsonb

Демо

...