2016-10-19 4 views
2

У меня есть таблица «Документы», которая имеет столбец «Теги» с типом данных «jsonb». Выборочные данные в столбце МеткиВыберите значение столбца jsonb в PostgreSQL

[{"Tag": "Social Media"}, {"Tag": "Adobe Creative"}] 
[{"Tag": "Interactive"}] 
[{"Tag": "Web 2.0"}, {"Tag": "Adobe Creative"},{"Tag": "Suite"}] 

Мне нужно, чтобы получить различные значения «Tag», как

Social Media 
Adobe Creative 
Interactive 
Web 2.0 
Suite 

Я новичок в PostgreSQL.

+0

Это может вам помочь. http://dba.stackexchange.com/questions/102556/is-it-possible-to-select-distinct-values-in-a-json-document-using-postgresql –

ответ

2

Самый короткий вариант был бы:

SELECT DISTINCT value->'Tag' AS tag 
FROM Documents, jsonb_array_elements(Documents.Tags); 

jsonb_array_elements() function unnests массив JSONB в набор строк с одной колонке под названием «значение». Он использует неявное «боковое соединение» в таблице Documents.

Это дает вам отличные от метки значения jsonb. Если вы хотите, чтобы они были как text, используйте оператор ->> вместо ->.

+0

Большое спасибо. Вы спасли мое время. –

+0

Если мне нужно добавить условие where с этим типом данных jsonb, что мне делать? Например. выберите * из документов, где теги -> 'Tag' = 'Suite' –

+0

Если я правильно понял ваш вопрос, тогда ответ будет отрицательным, потому что вы не можете напрямую обращаться к вычисленным значениям поля в списке выбора в качестве условий фильтра. Вам нужно будет либо повторить вызовы функций, либо, возможно, проще в вашем случае - использовать вышеперечисленное в качестве подзапроса, а затем фильтровать в основном запросе. В любом случае вы должны использовать оператор '- >>' для получения текстовой версии объекта JSON. – Patrick

Смежные вопросы