SQL实现多规则拆分字符串字段的方案问询
字符串拆分需求实现方案
完全可以用CASE WHEN结合字符串判断函数实现需求,以下以SQL Server语法为例(如果你使用其他数据库,仅需替换对应字符串函数即可):
实现逻辑说明
- 优先判断字段是否包含下划线,包含则直接按下划线拆分,注意拆分时要去掉下划线本身
- 不包含下划线的场景:
- 先匹配
4FH/GWO/CTW三个前缀,匹配成功则取前3位为第一列,剩余内容为第二列 - 不匹配上述前缀但以
4开头的,取第1位为第一列,剩余内容为第二列
- 先匹配
可直接运行的SQL语句
SELECT lr.Source AS OriginalSource, -- 拆分后的第一列Source CASE WHEN CHARINDEX('_', lr.Source) > 0 THEN LEFT(lr.Source, CHARINDEX('_', lr.Source) - 1) WHEN LEFT(lr.Source, 3) IN ('4FH', 'GWO', 'CTW') THEN LEFT(lr.Source, 3) WHEN LEFT(lr.Source, 1) = '4' THEN LEFT(lr.Source, 1) -- 不满足上述规则的字符串可在这里补充ELSE兜底逻辑 ELSE lr.Source END AS Source, -- 拆分后的第二列Instance CASE WHEN CHARINDEX('_', lr.Source) > 0 THEN RIGHT(lr.Source, LEN(lr.Source) - CHARINDEX('_', lr.Source)) WHEN LEFT(lr.Source, 3) IN ('4FH', 'GWO', 'CTW') THEN RIGHT(lr.Source, LEN(lr.Source) - 3) WHEN LEFT(lr.Source, 1) = '4' THEN RIGHT(lr.Source, LEN(lr.Source) - 1) ELSE '' END AS Instance FROM 你的表名 lr
其他数据库适配说明
如果你使用MySQL,仅需替换对应函数即可:
CHARINDEX('_', 字段)替换为LOCATE('_', 字段)LEN(字段)替换为CHAR_LENGTH(字段)
补充说明
你提供的示例中ETK_ETK-40输出Instance为40,如果是需要对下划线拆分后的内容做二次截取,可在对应CASE分支中额外增加截取逻辑即可。
内容的提问来源于stack exchange,提问作者Clumsywolfy
相关产品推荐
相关产品推荐

