Snowflake:如何根据条件将数组值映射为星期名称?
正确解决方案:将数组映射为星期名称并拼接
原SQL的问题分析
你的SQL报错及逻辑问题如下:
- 错误指定
col1作为FLATTEN的输入列,实际需要处理的是day_val数组 - 子查询未保留原表的
ID、Col1~Col10等字段,外层查询无法引用tbl1.*导致报错 - 未对数组元素做
TRIM处理,元素带空格会导致DECODE匹配失败 - 预期结果中的
Wednsday是拼写错误,正确应为Wednesday
修正后的完整SQL
SELECT t1.ID, t1.Col1, t1.Col2, t1.Col3, t1.col4, t1.Col5, t1.col6, t1.Col7, t1.Col8, t1.Col9, t1.col10, t1.day_val, LISTAGG( DECODE(TRIM(t.value), '1','Sunday', '2','Monday', '3','Tuesday', '4','Wednesday', '5','Thursday', '6','Friday', '7','Saturday' ), ', ') WITHIN GROUP (ORDER BY TRIM(t.value)) AS Days FROM tbl1 t1 LATERAL FLATTEN(input => t1.day_val) t GROUP BY t1.ID, t1.Col1, t1.Col2, t1.Col3, t1.col4, t1.Col5, t1.col6, t1.Col7, t1.Col8, t1.Col9, t1.col10, t1.day_val ORDER BY t1.ID;
关键说明
- 直接从原表关联
LATERAL FLATTEN,保留所有原表字段,避免子查询导致的表引用问题 - 用
TRIM(t.value)处理数组元素的空格,确保数字与DECODE的键准确匹配 - 通过
LISTAGG按数字顺序拼接星期名称,保证结果顺序符合要求 - 修正了拼写错误,将
Wednsday改为正确的Wednesday
执行结果
执行后会得到符合预期的输出:
ID Col1 Col2 Col3 col4 Col5 col6 col7 col8 col9 col10 day_val Days 101 null b-col2 null d-col4 null null f-col7 null h-col9 g-col10 [ "3" ] Tuesday 102 null Null c-col3 null d-col5 e-col6 null g-col8 null null [ "1", "3" ] Sunday, Tuesday 103 a-col1 Null null null null null null null null null [ "1", "2", "3", "4", "5" ] Sunday, Monday, Tuesday, Wednesday, Thursday 104 null b-col2 null d-col4 d-col5 null null null null null [ "1", "2", "3", "4", "5" , "6", "7" ] Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

