如何从SQL Server列中提取首个括号内的数据?
在SQL Server中提取列里首个括号内的数据
需求说明
现有SQL Server列数据示例:
Pace - (SPE)-Elkart IN (OEM Sales) Pace - (CIS) - San Francisco (CIS) Pietila, Robert (4060) Pace - (STP) - St Paul Manufacturing
需要提取每行中首个括号内的内容,期望结果:
SPE CIS 4060 STP
实现方案
利用SQL Server的CHARINDEX和SUBSTRING函数组合实现,核心思路是定位首个左括号和对应的右括号位置,再截取中间内容。
基础SQL语句
SELECT 原列名, SUBSTRING( 原列名, CHARINDEX('(', 原列名) + 1, CHARINDEX(')', 原列名, CHARINDEX('(', 原列名)) - CHARINDEX('(', 原列名) - 1 ) AS 首个括号内容 FROM 你的表名;
函数作用解释
CHARINDEX('(', 原列名):定位字符串中第一个左括号(的位置CHARINDEX(')', 原列名, CHARINDEX('(', 原列名)):从第一个左括号的位置开始,找到对应的右括号)的位置SUBSTRING(字符串, 起始位置, 长度):从左括号后一位开始,截取到右括号前一位的内容
兼容无括号的情况
如果列中存在无括号的行,可通过CASE WHEN避免错误结果:
SELECT 原列名, CASE WHEN CHARINDEX('(', 原列名) > 0 AND CHARINDEX(')', 原列名, CHARINDEX('(', 原列名)) > CHARINDEX('(', 原列名) THEN SUBSTRING( 原列名, CHARINDEX('(', 原列名) + 1, CHARINDEX(')', 原列名, CHARINDEX('(', 原列名)) - CHARINDEX('(', 原列名) - 1 ) ELSE NULL -- 无括号时返回NULL,也可改为空字符串'' END AS 首个括号内容 FROM 你的表名;
测试验证
用示例数据创建临时表测试:
-- 创建测试表并插入数据 DECLARE @TestTable TABLE (ColumnName VARCHAR(100)) INSERT INTO @TestTable VALUES ('Pace - (SPE)-Elkart IN (OEM Sales)'), ('Pace - (CIS) - San Francisco (CIS)'), ('Pietila, Robert (4060)'), ('Pace - (STP) - St Paul Manufacturing') -- 提取数据 SELECT ColumnName AS 原数据, SUBSTRING( ColumnName, CHARINDEX('(', ColumnName) + 1, CHARINDEX(')', ColumnName, CHARINDEX('(', ColumnName)) - CHARINDEX('(', ColumnName) - 1 ) AS 首个括号内容 FROM @TestTable;
执行后将得到期望结果:
| 原数据 | 首个括号内容 |
|---|---|
| Pace - (SPE)-Elkart IN (OEM Sales) | SPE |
| Pace - (CIS) - San Francisco (CIS) | CIS |
| Pietila, Robert (4060) | 4060 |
| Pace - (STP) - St Paul Manufacturing | STP |
内容的提问来源于stack exchange,提问作者dsayalee
相关产品推荐
相关产品推荐

