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

Snowflake使用LATERAL FLATTEN展平变长JSON丢失记录如何处理

解决方案

你遇到的记录丢失问题是Snowflake默认LATERAL FLATTEN为内连接行为导致的:当待展平的字段(这里是crossListedCourses)不存在、值为null或为空数组时,内连接会直接过滤掉对应原始记录。

要保留所有原始记录,只需将LATERAL FLATTEN改为外连接模式即可,有两种等价写法可选:

写法1:直接加OUTER关键字(语法更直观,效果等价于LEFT JOIN)

SELECT 
    json_string:course.className AS course_className,
    json_string:course.courseType AS course_courseType,
    json_string:course.crn AS course_crn,
    json_string:course.crossListedCourses AS crossListedCourses,
    prod.value:className AS cross_className,
    prod.value:courseType AS cross_courseType,
    prod.value:crn AS cross_crn,
    prod.value:lmsCourseID AS cross_lmsCourseID,
    prod.value:partialTermCode AS cross_partialTermCode,
    prod.value:subject AS cross_subject,
    prod.value:subjectCode AS cross_subjectCode,
    prod.value:term AS cross_term
FROM variant_example, 
OUTER LATERAL FLATTEN (input => json_string:course.crossListedCourses) AS prod

写法2:在FLATTEN参数中指定OUTER => TRUE(效果和写法1完全一致)

SELECT 
    json_string:course.className AS course_className,
    json_string:course.courseType AS course_courseType,
    json_string:course.crn AS course_crn,
    json_string:course.crossListedCourses AS crossListedCourses,
    prod.value:className AS cross_className,
    prod.value:courseType AS cross_courseType,
    prod.value:crn AS cross_crn,
    prod.value:lmsCourseID AS cross_lmsCourseID,
    prod.value:partialTermCode AS cross_partialTermCode,
    prod.value:subject AS cross_subject,
    prod.value:subjectCode AS cross_subjectCode,
    prod.value:term AS cross_term
FROM variant_example, 
LATERAL FLATTEN (input => json_string:course.crossListedCourses, OUTER => TRUE) AS prod

调整后第三条没有crossListedCourses的记录会完整保留,所有和交叉课程相关的字段会返回null值,不会被过滤。另外原查询中json_string:crossListedCourses路径错误,已修正为json_string:course.crossListedCourses,你可以根据实际需求调整字段别名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:06:03