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

如何在Snowflake中检查嵌套JSON的所有regions数组是否为空

Snowflake SQL检查嵌套JSON中所有regions数组是否为空

核心思路

逐层展开嵌套的JSON数组(objects → clusters → regions),验证是否存在非空的regions数组,最终返回布尔值表示所有regions是否都为空。

实现方法

方法1:使用NOT EXISTS快速判断

通过FLATTEN逐层展开嵌套数组,利用NOT EXISTS检查是否存在非空的regions数组,一旦找到非空项直接返回false,性能更高效。

WITH test_data AS (
    -- 示例1:所有regions为空
    SELECT PARSE_JSON('{
        "objects": [
            {
                "zone": "zone_name",
                "clusters": [
                    { "cluster_name": "abc", "regions": [] },
                    { "cluster_name": "def", "regions": [] },
                    { "cluster_name": "ghi", "regions": [] }
                ]
            }
        ]
    }') AS json_col
    UNION ALL
    -- 示例2:存在非空regions
    SELECT PARSE_JSON('{
        "objects": [
            {
                "zone": "zone_name",
                "clusters": [
                    { "cluster_name": "abc", "regions": [] },
                    { "cluster_name": "def", "regions": [] },
                    { "cluster_name": "ghi", "regions": ["UK","london"] }
                ]
            }
        ]
    }') AS json_col
)
SELECT
    json_col,
    NOT EXISTS (
        SELECT 1
        FROM FLATTEN(input => json_col:objects) obj
        , FLATTEN(input => obj.value:clusters) clus
        WHERE ARRAY_SIZE(clus.value:regions) > 0
    ) AS all_regions_empty
FROM test_data;

方法2:使用BOOL_AND聚合判断

逐层展开所有嵌套数组后,用BOOL_AND聚合每个regions数组的空值判断结果,只有全部为空时返回true。

WITH test_data AS (
    SELECT PARSE_JSON('{
        "objects": [
            {
                "zone": "zone_name",
                "clusters": [
                    { "cluster_name": "abc", "regions": [] },
                    { "cluster_name": "def", "regions": [] },
                    { "cluster_name": "ghi", "regions": [] }
                ]
            }
        ]
    }') AS json_col
    UNION ALL
    SELECT PARSE_JSON('{
        "objects": [
            {
                "zone": "zone_name",
                "clusters": [
                    { "cluster_name": "abc", "regions": [] },
                    { "cluster_name": "def", "regions": [] },
                    { "cluster_name": "ghi", "regions": ["UK","london"] }
                ]
            }
        ]
    }') AS json_col
)
SELECT
    json_col,
    BOOL_AND(ARRAY_SIZE(clus.value:regions) = 0) AS all_regions_empty
FROM test_data
, LATERAL FLATTEN(input => json_col:objects) obj
, LATERAL FLATTEN(input => obj.value:clusters) clus
GROUP BY json_col;

关键函数说明

  • FLATTEN:展开JSON数组,将数组中的每个元素转为单独的行。
  • ARRAY_SIZE:返回数组的元素个数,0表示空数组。
  • NOT EXISTS:判断子查询是否存在结果,不存在则返回true。
  • BOOL_AND:聚合函数,仅当所有输入布尔值为true时,返回true。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:19:57