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

如何在Snowflake中使用LATERAL FLATTEN动态提取JSON值?

动态提取JSON中的问答对(Snowflake实现)

问题背景

现有JSON数据结构如下:

{"explosives_UG":{"isCritical": false,"value": "N/A"},"explosivesUG": {"comment": "Test 619 313","createWo": false,"isCritical": false,"value": "No"},"generalAttachment": null,"generalComment": "Test 619 313","guardsPostedUG": {"isCritical": false,"value": "Yes"},"imminentUG": {"isCritical": false,"value": "Yes"}}

此前通过手动指定Key的方式提取问答对,查询语句如下:

SELECT kv.key AS question,kv.value:value AS answer
FROM json_data,
LATERAL FLATTEN(input => json_col) kv
WHERE kv.key IN ('explosives_UG', 'explosivesUG', 'guardsPostedUG', 'imminentUG');

得到输出:

question        answer
explosives_UG   N/A
explosivesUG    No
guardsPostedUG  Yes
imminentUG      Yes

由于需要处理大量问答内容,手动维护Key耗时费力,希望通过LATERAL FLATTEN动态提取符合要求的问答对。

解决方案

可以通过两种方式实现动态提取:

方式1:自动识别含value字段的嵌套对象

直接筛选JSON中值为对象且包含value属性的键,无需手动指定目标Key:

SELECT 
    kv.key AS question,
    kv.value:value AS answer
FROM json_data,
LATERAL FLATTEN(input => json_col) kv
WHERE 
    kv.value::OBJECT IS NOT NULL 
    AND kv.value:value IS NOT NULL;

方式2:排除固定非目标字段

如果存在明确不需要的字段(比如generalAttachment、generalComment),直接排除这些Key即可:

SELECT 
    kv.key AS question,
    kv.value:value AS answer
FROM json_data,
LATERAL FLATTEN(input => json_col) kv
WHERE 
    kv.key NOT IN ('generalAttachment', 'generalComment')
    AND kv.value:value IS NOT NULL;

说明

  • 方式1更灵活,自动适配所有符合{..., value:...}格式的嵌套对象,适合JSON结构统一的场景。
  • 方式2适合有固定非目标字段的场景,只需维护排除列表,比维护目标Key列表更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:48:21