RedShift:嵌套 json 的一些问题

RedShift: some troubles with nested json

我有下一个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 级获取值。

一级:"promptnum":4,"corpuscode":"B0014","prompttype":"video","skipped":false,"transcription":"1","deviceinfo":...

二级:

"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,但它对我不起作用。

你能帮帮我吗?

Viktor 你有几个问题。首先,符号“AS d,d.device_info AS l”用于取消超级数据中的数组嵌套。您没有任何要取消嵌套的数组,因此这将返回零行。

第二个 Redshift 默认为所有列名小写,因此 DEVICE_ID 被视为 device_id。您可以通过将 enable_case_sensitive_identifier 连接变量设置为 true 并引用所有需要大写字符的列名来启用区分大小写的列名。 “设置 enable_case_sensitive_identifier 为真;”并将 l.DEVICE_ID 更改为 l."DEVICE_ID".

您的查询中也有不需要的图层。

把所有这些放在一起你可以运行:

SELECT l, l.deviceinfo, l.deviceinfo."DEVICE_ID" 
FROM (
    SELECT JSON_PARSE(file_attr) AS l
    FROM public.dc_ac_files
) AS c

您也不需要 SUPER 数据类型来执行此操作。这可以通过 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