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

如何用Snowflake SQL将分号分隔字符串转换为多行多列?

Snowflake 拆分混合分隔文本为多行多列

直接上能解决需求的SQL方案:

WITH split_data AS (
    -- 清理Contact字段并拆分成单行
    SELECT 
        ID,
        -- 去掉末尾多余分号,避免拆分出空值行
        TRIM(value) AS item,
        -- 给每个ID下的拆分项按顺序编号
        ROW_NUMBER() OVER(PARTITION BY ID ORDER BY SEQ) AS rn
    FROM your_table_name,
         -- 按分号拆分Contact,生成带顺序的行
         TABLE(SPLIT_TO_TABLE(TRIM(Contact, ';'), ';'))
),
grouped_data AS (
    -- 把每两个连续项(时间+邮箱)归为同一组
    SELECT 
        ID,
        item,
        -- 用编号整除2得到组ID,确保时间和邮箱配对
        CEIL(rn / 2) AS group_id,
        -- 标记当前项是时间还是邮箱(奇数行=时间,偶数行=邮箱)
        CASE WHEN rn % 2 = 1 THEN 'TIMESTAMP' ELSE 'EMAIL' END AS item_type
    FROM split_data
)
-- 将组内的项转成目标列
SELECT 
    ID,
    MAX(CASE WHEN item_type = 'TIMESTAMP' THEN item END) AS "Timestamp",
    MAX(CASE WHEN item_type = 'EMAIL' THEN item END) AS "Email"
FROM grouped_data
GROUP BY ID, group_id
ORDER BY ID, group_id;

关键逻辑说明:

  • 清理拆分:用TRIM(Contact, ';')去掉字段首尾的冗余分号,再通过SPLIT_TO_TABLE把分号分隔的内容拆成单行,同时保留拆分顺序。
  • 分组配对:通过ROW_NUMBER()给每个ID下的拆分项编号,再用CEIL(rn/2)把每两个连续项归为一组,保证时间和邮箱一一对应。
  • 转列聚合:用条件聚合MAX(CASE...)把组内的时间项和邮箱项分别提取成两列,最终得到目标结构。

如果你的Contact字段末尾没有多余分号,可以去掉TRIM(Contact, ';')里的第二个参数,直接用TRIM(Contact)清理空格即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:27:29