如何基于指定列的分隔多值将单条数据拆分为多条记录
按列值拆分单条记录为多行的实现方案
核心逻辑很直接:把要拆分的字段按指定分隔符(这里是;)拆成独立的值集,再把原记录的其他固定字段值匹配到每一个拆分出的值上,就能得到预期的输出效果,所有常用数据库、数仓引擎都能实现,下面是几个高频场景的具体写法:
- Hive / Spark SQL(数仓场景最常用)
直接用内置函数就能完成,不需要额外写自定义逻辑:
SELECT REC_KEY, SURR_KEY, REC_YR, MANUFACTURER, MODEL_NAME, -- 拆分后去掉前后冗余空格,避免脏数据 TRIM(eng_item) AS ENG_POWER FROM 你的原表 -- 先把ENG_POWER按分号拆成数组,再用explode把数组每个元素转成独立行 LATERAL VIEW EXPLODE(SPLIT(ENG_POWER, ';')) tmp_split AS eng_item
- PostgreSQL
靠数组展开函数实现拆分:
SELECT REC_KEY, SURR_KEY, REC_YR, MANUFACTURER, MODEL_NAME, TRIM(eng_item) AS ENG_POWER FROM 你的原表, -- 把分号分隔的字符串转成数组,再展开成多行 UNNEST(STRING_TO_ARRAY(ENG_POWER, ';')) AS eng_item
- MySQL 8.0 及以上版本
用内置的JSON_TABLE函数实现,不需要写自定义存储过程:
SELECT t.REC_KEY, t.SURR_KEY, t.REC_YR, t.MANUFACTURER, t.MODEL_NAME, TRIM(j.eng_item) AS ENG_POWER FROM 你的原表 t JOIN JSON_TABLE( -- 把分号拼接的字符串转成标准JSON数组格式供后续展开 CONCAT('["', REPLACE(t.ENG_POWER, ';', '","'), '"]'), '$[*]' COLUMNS(eng_item VARCHAR(100) PATH '$') ) j
实操注意点
- 拆分前建议加非空过滤,避免原字段为NULL或空字符串时,拆出无意义的空行
- 如果字段内分隔符不统一(比如混有半角分号、全角分号),拆分前可以先做统一字符替换,保证拆分准确
- 拆分出的字段长度要和实际值长度匹配,避免出现值截断问题
内容的提问来源于stack exchange,提问作者Yash Sharma
相关产品推荐
相关产品推荐

