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

如何在Snowflake中将单行内的多组列拆分为多行?

Snowflake中更高效的多组列转行实现

针对你需要将一行中多组电话字段拆分为多行的需求,Snowflake提供的UNPIVOT函数是比多次UNION更优的实现方式——它仅需扫描一次表,代码更简洁且维护性更强。

实现代码

假设你的表名为phone_table,可以用以下SQL直接得到目标结果:

SELECT 
  DATEMODIFIED,
  PHONE_CC,
  PHONE_NUM,
  PHONE_EXT
FROM 
  phone_table
UNPIVOT (
  (PHONE_CC, PHONE_NUM, PHONE_EXT) FOR PHONE_TYPE IN (
    (HOME_PHONE_CC, HOME_PHONE_NUM, HOME_PHONE_EXT) AS 'HOME',
    (OFFICE_PHONE_CC, OFFICE_PHONE_NUM, OFFICE_PHONE_EXT) AS 'OFFICE',
    (MOBILE_PHONE_CC, MOBILE_PHONE_NUM, MOBILE_PHONE_EXT) AS 'MOBILE'
  )
);

关键说明

  1. 多列UNPIVOT:这里的UNPIVOT直接处理每组3个字段(CC/NUM/EXT),将每组对应为一行,同时映射到统一的输出列名。
  2. 性能优势:原UNION方式需要对表执行3次扫描,而UNPIVOT仅扫描一次,在数据量较大时性能差异会非常明显。
  3. 维护性:如果后续新增其他电话类型(如FAX),只需在IN子句中添加一组字段映射即可,无需新增SELECT语句。
  4. NULL值处理:默认情况下UNPIVOT会过滤掉所有字段均为NULL的组,如果需要保留这类行,可以添加INCLUDE NULLS选项:
    UNPIVOT INCLUDE NULLS (
      (PHONE_CC, PHONE_NUM, PHONE_EXT) FOR PHONE_TYPE IN (...)
    )
    

结果示例

执行上述SQL后,会得到你期望的输出:

DATEMODIFIED,PHONE_CC,PHONE_NUM,PHONE_EXT
2019-05-17,1,123-456-789,111
2019-05-17,1,456-789-123,222
2019-05-17,1,789-123-456,333

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:15:06