BigQuery中获取record类型字段首个非空partnership_title及对应voucher_code
解决方案
假设funnels_informations是重复的RECORD类型(即数组结构,单个RECORD不存在"首个非空"的场景),以下是两种常用的实现方法:
方法一:通过UNNEST+ROW_NUMBER()排序取首个非空值
这种方法能严格保留数组元素的原始顺序,确保取到的是数组中最先出现的非空partnership_title及其对应voucher_code:
WITH ranked_data AS ( SELECT your_primary_key, -- 替换为你的表主键字段,用于关联原表数据 fi.partnership_title, fi.voucher_code, ROW_NUMBER() OVER ( PARTITION BY your_primary_key ORDER BY CASE WHEN fi.partnership_title IS NOT NULL THEN 0 ELSE 1 END, -- 非空值优先排序 OFFSET(fi) -- 按数组原始顺序排序 ) AS row_rank FROM your_table_name, -- 替换为你的表名 UNNEST(funnels_informations) AS fi WITH OFFSET ) SELECT your_primary_key, partnership_title, voucher_code FROM ranked_data WHERE row_rank = 1 -- 若需要仅返回存在非空partnership_title的行,可添加 AND partnership_title IS NOT NULL
方法二:用数组函数直接筛选取首元素
通过ARRAY_FILTER筛选出partnership_title非空的元素,再取数组第一个元素,写法更简洁:
SELECT your_primary_key, -- 替换为你的表主键字段 (SELECT partnership_title FROM UNNEST(ARRAY_FILTER(funnels_informations, x -> x.partnership_title IS NOT NULL)) LIMIT 1) AS partnership_title, (SELECT voucher_code FROM UNNEST(ARRAY_FILTER(funnels_informations, x -> x.partnership_title IS NOT NULL)) LIMIT 1) AS voucher_code FROM your_table_name -- 替换为你的表名
补充说明
- 如果
funnels_informations是单个RECORD类型,直接取funnels_informations.partnership_title和funnels_informations.voucher_code即可,但这种场景无需"首个非空"的逻辑。 - 方法二中如果数组筛选后为空,结果会返回
NULL,符合你示例中voucher_code=null的需求。
内容的提问来源于stack exchange,提问作者Souhir AROUS
相关产品推荐
相关产品推荐

