SQL动态拆分字符串:适配含不同数量'-'分隔符的场景需求
SQL按'-'拆分Name列适配所有场景的解决方案
需求说明
现有数据表包含Name列,需按-分隔符拆分得到指定的Required Output列,示例如下:
| Name | Required Output |
|---|---|
| itim-connect-prd | CONNECT |
| WHATS-PRD | WHATS |
| Commitment-FinOps | COMMITMENT |
| itim-xbl-hml | XBL |
| itim-audit-hml | AUDIT |
| BSC-AWS-Accounts-Roots | AWS |
原有脚本问题
当前使用的SQL脚本仅支持包含至少两个-的场景,无法处理仅含一个-的情况(如Commitment-FinOps、WHATS-PRD):
UPPER(SUBSTRING(SUBSTRING([Name],CHARINDEX('-',[Name])+1,CHARINDEX('-', [Name], CHARINDEX('-', [Name]) + 1)),1,CHARINDEX('-',SUBSTRING([Name],CHARINDEX('-',[Name])+1,CHARINDEX('-', [Name], CHARINDEX('-', [Name]) + 1)))-1)) AS [Required Output]
修改后的适配脚本
以下脚本通过判断Name中-的数量,分别处理单分隔符和多分隔符场景,完美适配所有示例情况:
UPPER( CASE -- 仅含一个'-'时,取分隔符左侧内容 WHEN LEN([Name]) - LEN(REPLACE([Name], '-', '')) = 1 THEN LEFT([Name], CHARINDEX('-', [Name]) - 1) -- 含两个及以上'-'时,取第一个与第二个'-'之间的内容 ELSE SUBSTRING( [Name], CHARINDEX('-', [Name]) + 1, CHARINDEX('-', [Name], CHARINDEX('-', [Name]) + 1) - CHARINDEX('-', [Name]) - 1 ) END ) AS [Required Output]
核心逻辑
- 统计分隔符数量:用
LEN([Name]) - LEN(REPLACE([Name], '-', ''))计算Name中-的总个数 - 单分隔符场景:直接截取
-左侧的字符串,匹配示例中WHATS-PRD→WHATS、Commitment-FinOps→COMMITMENT的规则 - 多分隔符场景:提取第一个
-之后、第二个-之前的子串,匹配示例中itim-connect-prd→CONNECT、BSC-AWS-Accounts-Roots→AWS的规则
内容的提问来源于stack exchange,提问作者Madha venugopal
相关产品推荐
相关产品推荐

