Расширение массива JSON до текстовых значений с помощью NULL - PullRequest
0 голосов
/ 20 сентября 2018

У меня проблемы с генерацией запроса для отображения массива JSON с набором текстовых значений при наличии значений NULL.Предположим, у меня есть следующая таблица:

Name | Meta
Art0 | {"category":["sport"]}
Art1 | [NULL]
Art2 | {"category":["sport", "health"]}

Если я сделаю что-то вроде:

SELECT name, jsonb_array_elements_text(meta->'category') tag FROM table

Я получаю следующие результаты:

Name | Tag
Art0 | sport
Art2 | sport
Art2 | health

Проблемаявляется то, что Art1 удаляется.Как выполнить запрос, который также содержит строку для Art1 и пустую строку или значение NULL в столбце Tag?

Спасибо

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018

и без join / union:

SELECT
  name,
  jsonb_array_elements_text(coalesce(meta->'category', '[null]')) tag
FROM table;
0 голосов
/ 20 сентября 2018

Вы можете сделать это с LEFT JOIN, как при работе с таблицами:

SELECT name, tag FROM table
LEFT OUTER JOIN jsonb_array_elements_text(meta->'category') tag ON TRUE

В результате:

name    tag
Art0    sport
Art1    (null)
Art2    sport
Art2    health
0 голосов
/ 20 сентября 2018

Использование union

SELECT name, jsonb_array_elements_text(meta->'category') tag FROM table UNION 
SELECT id, attrs::text tag FROM table where meta is null;

Результат:

name    tag
Art0    sport
Art2    sport
Art2    health
Art1    
0 голосов
/ 20 сентября 2018

Использование left join:

select name, tag 
from my_table
left join jsonb_array_elements_text(meta->'category') as tag on true

 name |  tag   
------+--------
 Art0 | sport
 Art1 | 
 Art2 | sport
 Art2 | health
(4 rows)    

Это боковое соединение, т.е. функция выполняется один раз для каждой строки таблицы.Обычно такое объединение записывается как cross join, но мы хотим получить результаты также, когда функция ничего не возвращает.Для этого мы можем использовать left join, для которого необходимо условие соединения, поэтому мы используем true как всегда выполненное условие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...