2016-07-20 3 views
2

Я получаю доступ к массиву (объект json под названием «choice_values») в поле jsonb и хотел бы проанализировать его содержимое в текстовое поле, разделенное запятыми.Возвращает результат jsonb_array_elements как список, разделенный запятой

SELECT 
    jsonb_array_elements(doc -> 'form_values' -> '8189' -> 'choice_values') 
FROM 
    field_data.exports; 

Эта функция возвращает jsonb_array_elements «setof текст», который я хотел бы превращали в разделенных запятыми список значений массива, содержащегося в одном поле.

спасибо.

ответ

2

Набор возвращаемых функций (например, jsonb_array_elements_text()) можно вызвать в списке SELECT, но тогда они не могут использоваться в совокупных функциях.

Это хорошая практика, чтобы назвать набор функций, возвращающих в ЕКОМ, часто в боковой присоединиться как в этом примере:

with the_data as (
    select '["alfa", "beta", "gamma"]'::jsonb as js 
    ) 

select string_agg(elem, ',') 
from 
    the_data, 
    jsonb_array_elements_text(js) elem; 

    string_agg  
----------------- 
alfa,beta,gamma 
(1 row)  

Таким образом, ваш запрос должен выглядеть следующим образом:

select string_agg(elem, ',') 
from 
    field_data.exports, 
    jsonb_array_elements_text(doc -> 'form_values' -> '8189' -> 'choice_values') elem; 
1

Использование string_agg aggregate function с подвыборкой от jsonb_array_elements_text похоже на работу (проверено на PG 9.5). Обратите внимание на использование jsonb_array_elements_text, добавленного в PostgreSQL 9.4, а не jsonb_array_elements, из PostgreSQL 9.3.

with exports as (
    select $${"form_values": {"8189": {"choice_values": ["a","b","c"]}}}$$::jsonb as doc 
) 
SELECT 
    string_agg(values, ', ') 
FROM 
    exports, jsonb_array_elements_text(doc -> 'form_values' -> '8189' -> 'choice_values') values 
GROUP BY 
    exports.doc; 

Выход:

'a, b, c'

Также см this question and its answers.

+1

Да , и я должен был заметить, что в вопросе, извините. По какой-то причине функция string_agg видит результат jsonb_array_elements() как тип «jsonb», а не «setof text». Вот ошибка: «ErrorMessage: function string_agg (jsonb, text) не существует» – Joebocop

+0

Я тоже что-то забыл в вашем вопросе. Вам нужно использовать 'jsonb_array_elements_text' ([добавлено в PG 9.4] (https://www.postgresql.org/docs/9.4/static/functions-json.html)), чтобы получить' setof text', а не 'jsonb' как выход. –

+0

См. Другой вопрос, с которым я связался, если вам нужно использовать PG 9.3 по какой-либо причине; у него есть некоторые обходные пути. –