Красное смещение: некоторые проблемы с вложенным json

#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