You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snowflake读取JSON遇空值问题:如何提取ident数组中的指定字段值

解决JSON字段读取返回null的问题

问题原因

你的JSON结构中,ident是字符串数组,每个元素是key:value格式的普通字符串,并非嵌套JSON对象。之前的查询用JSON_EXTRACT_PATH_TEXT直接查找Product或Product[0].Product,路径完全错误,所以返回null。

另外,你的INSERT语句存在语法错误,缺少闭合的括号,修正后才能正常执行:

INSERT INTO SAMPLE_J(SAMPLE_JSON)
VALUES ('{"ident":["Product:Tires","sender_id:12345","sender_name:John Who","Tire_Condition:New"]}');

正确处理步骤

1. 展开数组元素

先用FLATTEN函数将ident数组拆分为多行,每行对应一个key:value字符串:

SELECT 
  s.SAMPLE_JSON,
  f.value AS ident_item
FROM SAMPLE_J s,
LATERAL FLATTEN(INPUT => PARSE_JSON(s.SAMPLE_JSON):ident) f;

执行后会输出每行对应一个数组元素的结果。

2. 拆分键值对

用SPLIT_PART按:拆分字符串,分离出键和值:

SELECT 
  s.SAMPLE_JSON,
  SPLIT_PART(f.value, ':', 1) AS key_name,
  SPLIT_PART(f.value, ':', 2) AS key_value
FROM SAMPLE_J s,
LATERAL FLATTEN(INPUT => PARSE_JSON(s.SAMPLE_JSON):ident) f;

执行后会得到拆分后的键、值两列数据。

3. 行转列(生成目标列)

如果需要将键值对转为列格式,使用PIVOT完成行转列:

WITH parsed_data AS (
  SELECT 
    SPLIT_PART(f.value, ':', 1) AS key_name,
    SPLIT_PART(f.value, ':', 2) AS key_value
  FROM SAMPLE_J s,
  LATERAL FLATTEN(INPUT => PARSE_JSON(s.SAMPLE_JSON):ident) f
)
SELECT 
  *
FROM parsed_data
PIVOT(MAX(key_value) FOR key_name IN ('Product', 'sender_id', 'sender_name', 'Tire_Condition')) AS p;

最终会生成你需要的结构化列数据。


内容的提问来源于stack exchange,提问作者ipeoples

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:23:18