#amazon-redshift
Вопрос:
У меня есть следующий JSON:
{"promptnum":4,"corpuscode":"B0014","prompttype":"video","skipped":false,"transcription":"1","deviceinfo":{"DEVICE_ID":"exynos980","DEVICE_MANUFACTURER":"samsung","DEVICE_SERIAL":"unknown","DEVICE_DESIGN":"a51x","DEVICE_MODEL":"SM-A5160","DEVICE_OS":"android","DEVICE_OS_VERSION":"10","DEVICE_CARRIER":"","DEVICE_BATTERY_LEVEL":"70.00%","DEVICE_BATTERY_STATE":"unplugged","Current App Version":"1.1.0","Current App Build":"6"}}
Я хочу получить значения с 1-го уровня и 2-го уровня.
1-й уровень: "promptnum":4,"corpuscode":"B0014","prompttype":"video","skipped":false,"transcription":"1","deviceinfo":...
2-й уровень:
"deviceinfo":{"DEVICE_ID":"exynos980","DEVICE_MANUFACTURER":"samsung","DEVICE_SERIAL":"unknown","DEVICE_DESIGN":"a51x","DEVICE_MODEL":"SM-A5160","DEVICE_OS":"android","DEVICE_OS_VERSION":"10","DEVICE_CARRIER":"","DEVICE_BATTERY_LEVEL":"70.00%","DEVICE_BATTERY_STATE":"unplugged","Current App Version":"1.1.0","Current App Build":"6"}
Когда я разбираю 1-й уровень с
SELECT d.*
FROM (
SELECT c.json_parse, c.json_parse.deviceinfo AS device_info
FROM (
SELECT JSON_PARSE(file_attr)
FROM public.dc_ac_files
) AS c) AS d
это хорошая работа.
Но когда я пытаюсь получить значения со 2-го уровня с помощью
SELECT d.*, l.DEVICE_ID
FROM (
SELECT c.json_parse, c.json_parse.deviceinfo AS device_info
FROM (
SELECT JSON_PARSE(file_attr)
FROM public.dc_ac_files
) AS c) AS d, d.device_info AS l
это не работает — ни ошибок, ни данных.
Если я знаю, это правильный способ анализа вложенного json, но он не работает для меня.
Вы не могли бы мне помочь?
Комментарии:
1. Пожалуйста, используйте форматирование. Размещение длинных строк json в одной строке-это нонсенс. Не могли бы вы поместить свой код в одну строку?
Ответ №1:
Виктор, у тебя есть пара вопросов. Сначала обозначение «КАК d, d.device_info КАК l» используется для удаления массивов в ваших суперданных. У вас нет никаких массивов для отмены, поэтому это возвращает нулевые строки.
Второе красное смещение по умолчанию в нижнем регистре для всех имен столбцов, поэтому идентификатор устройства рассматривается как идентификатор устройства. Вы можете включить имена столбцов с учетом регистра, установив переменную подключения enable_case_sensitive_identifier в значение true и заключив в кавычки все имена столбцов, для которых требуются верхние символы. «УСТАНОВИТЕ для параметра enable_case_sensitive_identifier ЗНАЧЕНИЕ true;» и измените l.ИДЕНТИФИКАТОР УСТРОЙСТВА на l.»ИДЕНТИФИКАТОР УСТРОЙСТВА».
В вашем запросе также есть ненужные слои.
Собрав все это вместе, вы можете запустить:
SELECT l, l.deviceinfo, l.deviceinfo."DEVICE_ID"
FROM (
SELECT JSON_PARSE(file_attr) AS l
FROM public.dc_ac_files
) AS c
Для этого вам также не нужен СУПЕР тип данных. Это можно сделать с помощью функций синтаксического анализа строк json.
SELECT file_attr, json_extract_path_text(file_attr, 'deviceinfo') as deviceinfo, json_extract_path_text(file_attr, 'deviceinfo','DEVICE_ID') as device_id
FROM public.dc_ac_files
Комментарии:
1. Вы правы! Несколько минут назад я тоже нашел это решение. Мой вариант: ВЫБЕРИТЕ json_extract_path_text(json_extract_path_text(file_attr, ‘deviceinfo’), ‘ИДЕНТИФИКАТОР УСТРОЙСТВА’) ИЗ public.dc_ac_files В КАЧЕСТВЕ данных; Но, возможно, вы измените более коротко
2. Приятно слышать. Как вы видите, нет необходимости вкладывать функции извлечения. Я вижу, в последнее время вы задаете много вопросов. Получение бесплатных ответов-хороший подход, но если вам нужна более быстрая поддержка, я помогаю клиентам настроить Redshift и работать-это то, что я делаю. Возможно, вы захотите рассмотреть возможность получения платной помощи.
3. сколько это стоило? Это неплохая идея — получить платную поддержку. Но также я хочу увеличить свою учетную запись stackoverflow.
4. Я хотел бы с уважением отнестись к условиям SO. Если вы заинтересованы в изучении, вы можете связаться со мной через мой веб — сайт- wadevelopment.co