SQL中如何将单列混合字符串拆分至字符、数字两列?
拆分混合字符串中的字符与数字到独立列
下面针对几种主流数据库,给出直接可用的SQL语句,实现将类似A1B2C3D4的混合字符串拆分到已有的字符列和数字列:
MySQL / MariaDB
直接利用REGEXP_REPLACE函数替换掉不需要的内容:
- 提取所有字符(去掉数字):用正则匹配数字并替换为空
- 提取所有数字(去掉字符):用正则匹配非数字并替换为空
执行更新的SQL语句:
UPDATE your_table SET char_col = REGEXP_REPLACE(mixed_col, '[0-9]', ''), num_col = REGEXP_REPLACE(mixed_col, '[^0-9]', '');
注:如果字符串包含小写字母,上述语句同样适用;如果需要过滤掉其他特殊字符,可调整正则为[^a-zA-Z]来提取纯字母。
SQL Server
SQL Server 2017及以上版本可使用TRANSLATE+REPLACE的组合来实现:
- 提取字符:把所有数字替换为占位符
#,再移除所有# - 提取数字:把所有大小写字母替换为占位符
#,再移除所有#
更新语句示例:
UPDATE your_table SET char_col = REPLACE(TRANSLATE(mixed_col, '0123456789', '##########'), '#', ''), num_col = REPLACE(TRANSLATE(mixed_col, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', REPLICATE('#', 52)), '#', '');
如果你的SQL Server版本低于2017,可创建自定义标量函数来遍历字符串提取目标内容。
PostgreSQL
同样使用正则替换函数REGEXP_REPLACE,语法略有不同:
\d匹配数字,'g'参数表示全局替换[^\d]匹配非数字内容
更新语句:
UPDATE your_table SET char_col = REGEXP_REPLACE(mixed_col, '\d', '', 'g'), num_col = REGEXP_REPLACE(mixed_col, '[^\d]', '', 'g');
注意事项
- 确保目标列
char_col和num_col的长度足够容纳提取后的内容,避免截断 - 如果混合字符串中包含除字母、数字外的其他特殊字符,需根据需求调整正则表达式规则
内容的提问来源于stack exchange,提问作者MarcusWilliams
相关产品推荐
相关产品推荐

