Postgresql - отдельные значения из массива jsonb

У меня есть следующий столбец (теги) массива jsonb

|name | tags (jsonb)   |
--------------------------------
|john | [ "foo", "bar" ]
|smith| [ "bar", "bat" ]
|adam | [ "foo", "dot" ]

Как получить следующие отдельные теги ["foo", "bar", "bat", "dot"]?


person Yans    schedule 11.01.2017    source источник
comment
Я думаю, вы имели в виду ["foo", "bar", "bat", "dot"], вы дважды написали bar.   -  person fpietka    schedule 11.01.2017
comment
@fpietka да, спасибо, что указали на это!   -  person Yans    schedule 11.01.2017
comment
ты попробовал мой ответ?   -  person e4c5    schedule 12.01.2017
comment
@ e4c5, еще нет .. связан с другими вещами .. обязательно проверю и оставлю свой отзыв!   -  person Yans    schedule 12.01.2017
comment
Когда вы публикуете здесь вопросы, вы просите людей найти время, чтобы прочитать их, а затем некоторые из этих читателей найдут время, чтобы подумать и написать ответ. Конечно, вы можете выделить немного своего времени, чтобы попробовать эти ответы ??   -  person e4c5    schedule 14.01.2017


Ответы (1)


Это решит вашу конкретную проблему.

SELECT DISTINCT tag FROM
  (SELECT name, JSONB_ARRAY_ELEMENTS(tags) as b FROM my_table) AS foo;

однако у вас есть более серьезная проблема. Хранение таких тегов - ошибка, которая повторяется слишком часто. Вам следует нормализовать вашу таблицу. См. Django JSONField внутри ArrayField

person e4c5    schedule 11.01.2017
comment
Спасибо за предложение, я нормализовал модель, и она выглядит намного чище для работы и обслуживания. - person Yans; 16.01.2017
comment
рад быть полезным - person e4c5; 16.01.2017
comment
К вашему сведению, предложение нормализации в этом ответе немного устарело - теперь, когда Postgres поддерживает индексы GIN в столбцах JSONB (с безумно быстрым оператором ? для тестирования массива / ключей), сохраняя теги в столбце JSONB вместо соединения table может помочь вам избежать массовых разветвлений во время запросов и является вполне разумным решением. - person Ben Gotow; 29.04.2021
comment
Напротив, Бен, вы следуете хорошо известному антипаттерну SQL, помещая данные, разделенные запятыми, в столбец. - person e4c5; 30.04.2021