PostgreSQL: не могу вывести значения JSON в одну строчку
Всем привет.
У меня возникла проблема с тем, как собрать key из JSON в одну строчку (сделать конкатенацию).
Запрос такой:
WITH all_values AS (
SELECT s.projectid AS projectid,
s.prompttype AS prompttype,
(s.attributes::jsonb)->>'prompt' AS prompt,
(s.attributes::jsonb)->>'description' AS description,
(s.attributes::jsonb)->>'topic' AS topic,
(s.attributes::jsonb)->>'context' AS context,
(s.attributes::jsonb)->>'use_case' AS use_case,
(s.attributes::jsonb)->>'subtitle' AS subtitle,
(s.attributes::jsonb)->>'txValues' AS txValues,
(s.attributes::jsonb)->>'flashmode' AS flashmode,
(s.attributes::jsonb)->>'skippable' AS skippable,
(s.attributes::jsonb)->>'videoMaxDuration' AS videoMaxDuration,
(s.attributes::jsonb)->>'defaultCameraFacing' AS defaultCameraFacing,
s.corpuscode AS corpuscode,
s.scriptid AS scriptid,
s.promptnum AS promptnum,
SELECT ARRAY_AGG(f)
FROM (
SELECT jsonb_object_keys(attributes::jsonb) f
FROM source_table
) AS u
FROM source_table AS s
WHERE
s.prompttype != 'input' AND (s.created > now() - interval '30 minutes' OR s.modified > now() - interval '30 minutes')
GROUP BY s.projectid, s.prompttype, prompt, description, topic, context, use_case, subtitle, txValues, flashmode, skippable, videoMaxDuration, defaultCameraFacing, corpuscode, scriptid, promptnum
)
SELECT * FROM all_values;
Ошибка: ERROR: syntax error at or near "SELECT" LINE 18: SELECT ARRAY_AGG(f)
Проверяю так:
SELECT ARRAY_AGG(f)
FROM (
SELECT jsonb_object_keys(attributes::jsonb) f
FROM source_table
) AS u;
и получается выводить.
Тестирую здесь: https://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=dcf7722ab857c13c2d3c8edf172b434e
P.S. В идеале в этом выводе мне нужно отфильтровать не все ключи, а только часть из них, но это следующий вопрос...
Ответы (1 шт):
Автор решения: Viktor Andriichuk
→ Ссылка
Правильно было бы составить запрос так:
WITH all_values AS (
SELECT s.projectid AS projectid,
s.prompttype AS prompttype,
(s.attributes::jsonb)->>'prompt' AS prompt,
(s.attributes::jsonb)->>'description' AS description,
(s.attributes::jsonb)->>'topic' AS topic,
(s.attributes::jsonb)->>'context' AS context,
(s.attributes::jsonb)->>'use_case' AS use_case,
(s.attributes::jsonb)->>'subtitle' AS subtitle,
(s.attributes::jsonb)->>'txValues' AS txValues,
(s.attributes::jsonb)->>'flashmode' AS flashmode,
(s.attributes::jsonb)->>'skippable' AS skippable,
(s.attributes::jsonb)->>'videoMaxDuration' AS videoMaxDuration,
(s.attributes::jsonb)->>'defaultCameraFacing' AS defaultCameraFacing,
s.corpuscode AS corpuscode,
s.scriptid AS scriptid,
s.promptnum AS promptnum,
(SELECT jsonb_agg(f)
FROM (
SELECT jsonb_object_keys(attributes::jsonb) f
FROM source_table
) AS u)
FROM source_table AS s
WHERE
s.prompttype != 'input' AND (s.created > now() - interval '30 minutes' OR s.modified > now() - interval '30 minutes')
GROUP BY s.projectid, s.prompttype, prompt, description, topic, context, use_case, subtitle, txValues, flashmode, skippable, videoMaxDuration, defaultCameraFacing, corpuscode, scriptid, promptnum
)
SELECT * FROM all_values;