Стол соединения на объекте JSON - PullRequest
0 голосов
/ 10 марта 2020

У меня есть таблица A, в которой есть JSON столбец f со следующим содержимым:

[{"name": "abc", "id": "1"}, {"name": "abcd", "id": "2"}, {"name": "abcde", "id": "3"} ]

Я хотел бы присоединиться к другой таблице B на id внутри JSON объекта, описанного выше, но также взять свойство name из JSON объекта.

Мне удалось создать следующий запрос:

WITH sample_data_array(arr) AS (
   SELECT f FROM A
), sample_data_elements(elem) AS (
   SELECT json_array_elements(arr) FROM sample_data_array
)
SELECT CAST(elem->>'id' AS int) AS id, elem->'name' AS name FROM sample_data_elements

, который возвращает следующий результат:

id, name
1, "abc"
2, "abcd"
3, "abcde"

Пример данных из Таблица B:

id, title, slug  
1, "title 1", "title-1"
2, "title 2", "title-2"
3, "title 3", "title-3"

Как объединить этот результат с таблицей B и добавить дополнительные данные (столбцы) из указанной таблицы?

Ожидаемый результат:

id, name, title, slug
1, "abc", "title 1", "title-1"
2, "abcd", "title 2", "title-2"
3, "abcde", "title 3", "title-3"

1 Ответ

1 голос
/ 10 марта 2020

Нажмите: demo: db <> fiddle

SELECT
    b.id,
    elems ->> 'name' as name,           -- 3
    b.title
FROM
    a,
    json_array_elements(f) as elems     -- 1
JOIN
    b ON b.id = (elems ->> 'id')::int   -- 2
  1. Получите элементы из массива json с помощью json_array_elements()
  2. сейчас Вы можете присоединиться к атрибутам JSON (в данном случае: атрибут id как text и привести его к значению int)
  3. После присоединения взять все соответствующие значения из b и элементы массива (например, name)
...