SQL实现将单列中分号分隔的拼接字符串拆分为3个独立列
SQL拆分分号分隔字符串为固定3列方案
不同数据库方言的内置字符串函数存在差异,以下给出主流数据库的可直接运行实现:
MySQL
使用SUBSTRING_INDEX搭配分隔符计数判断实现,避免短字符串重复取值问题:
SELECT 待拆分列名, SUBSTRING_INDEX(SUBSTRING_INDEX(待拆分列名, ';', 1), ';', -1) AS col1, CASE WHEN LENGTH(待拆分列名) - LENGTH(REPLACE(待拆分列名, ';', '')) >= 1 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(待拆分列名, ';', 2), ';', -1) ELSE NULL END AS col2, CASE WHEN LENGTH(待拆分列名) - LENGTH(REPLACE(待拆分列名, ';', '')) >= 2 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(待拆分列名, ';', 3), ';', -1) ELSE NULL END AS col3 FROM 表名;
PostgreSQL
直接使用内置数组函数实现,不存在的下标自动返回NULL:
SELECT 待拆分列名, (string_to_array(待拆分列名, ';'))[1] AS col1, (string_to_array(待拆分列名, ';'))[2] AS col2, (string_to_array(待拆分列名, ';'))[3] AS col3 FROM 表名;
SQL Server
通过转JSON数组取值实现,兼容2016及以上支持JSON函数的版本:
SELECT 待拆分列名, JSON_VALUE('["' + REPLACE(待拆分列名, ';', '","') + '"]', '$[0]') AS col1, JSON_VALUE('["' + REPLACE(待拆分列名, ';', '","') + '"]', '$[1]') AS col2, JSON_VALUE('["' + REPLACE(待拆分列名, ';', '","') + '"]', '$[2]') AS col3 FROM 表名;
Oracle
使用正则匹配函数直接提取对应位置的取值:
SELECT 待拆分列名, REGEXP_SUBSTR(待拆分列名, '[^;]+', 1, 1) AS col1, REGEXP_SUBSTR(待拆分列名, '[^;]+', 1, 2) AS col2, REGEXP_SUBSTR(待拆分列名, '[^;]+', 1, 3) AS col3 FROM 表名;
如果需要持久化存储拆分结果,可先执行ALTER TABLE语句新增3个目标列,再用上述逻辑执行UPDATE赋值即可;如果仅需查询使用,也可以基于上述逻辑创建视图简化后续调用。
内容的提问来源于stack exchange,提问作者Dano
相关产品推荐
相关产品推荐

