求助:从SQL临时表中提取指定格式的Brand字段内容
提取SQL表中指定格式的Brand字段内容
原始数据
原始临时表创建脚本如下:
SELECT * INTO #tmpTest FROM ( SELECT '(NORLANE) MADDERN 1200 (CONTEMPORARY 1 FACADE)' Brand UNION ALL SELECT '**do not use**ASCENT 2600 ASPEN' UNION ALL SELECT '**do not use**EVOLUTION 2300 ONTARIO' UNION ALL SELECT '**do not use**MERCHISTON 3800 TRADITIONAL' UNION ALL SELECT 'AERO 1600 BLAKE' UNION ALL SELECT 'ALBANY 1700 ASPEN (GENESIS)' UNION ALL SELECT 'Albion 161 - Matisse - Discontinued' UNION ALL SELECT 'Alexander 159 - Coastal' UNION ALL SELECT 'Almeda 344 - Huntington' UNION ALL SELECT 'Mendelsohn 234 Swift - Drysdale' )R SELECT * FROM #tmpTest
期望输出
需要提取每个Brand字段中的「品牌名称+数字编号」部分,输出如下:
| Brand |
|---|
| MADDERN 1200 |
| ASCENT 2600 |
| EVOLUTION 2300 |
| MERCHISTON 3800 |
| AERO 1600 |
| ALBANY 1700 |
| Albion 161 |
| Alexander 159 |
| Almeda 344 |
| Mendelsohn 234 |
尝试过的方法
使用CHARINDEX结合反转字符串的方式,但未得到正确结果:
CHARINDEX(' ',REVERSE(@str)) ,RIGHT(@str,CHARINDEX(' ',REVERSE(@str))-1)
解决方案
方法一:分步清理+提取前两部分
通过分步清理前缀无关内容,再提取前两个空格分隔的部分:
SELECT Brand, CASE WHEN CHARINDEX(' ', Clean2, CHARINDEX(' ', Clean2) + 1) > 0 THEN SUBSTRING(Clean2, 1, CHARINDEX(' ', Clean2, CHARINDEX(' ', Clean2) + 1) - 1) ELSE Clean2 END AS ExtractedBrand FROM ( SELECT Brand, -- 清理开头的括号内容及后续空格 CASE WHEN LEFT(Clean1, 1) = '(' THEN SUBSTRING(Clean1, CHARINDEX(')', Clean1) + 2, LEN(Clean1)) ELSE Clean1 END AS Clean2 FROM ( SELECT Brand, -- 移除"**do not use**"前缀 REPLACE(Brand, '**do not use**', '') AS Clean1 FROM #tmpTest ) t1 ) t2
方法二:使用PATINDEX精准匹配
利用PATINDEX定位数字后的第一个非数字分隔符,提取目标内容:
SELECT Brand, SUBSTRING(Clean2, 1, PATINDEX('% [^0-9]%', Clean2 + ' ') - 1) AS ExtractedBrand FROM ( SELECT Brand, -- 清理开头的括号内容并去除左侧空格 CASE WHEN LEFT(Clean1, 1) = '(' THEN LTRIM(SUBSTRING(Clean1, CHARINDEX(')', Clean1) + 1, LEN(Clean1))) ELSE Clean1 END AS Clean2 FROM ( SELECT Brand, REPLACE(Brand, '**do not use**', '') AS Clean1 FROM #tmpTest ) t1 ) t2
两种方法都能准确提取出期望的「品牌名称+数字编号」部分,其中方法二更灵活,能适配数字后不同类型的分隔符(空格、括号、短横线等)。
内容的提问来源于stack exchange,提问作者Karunakar Reddy
相关产品推荐
相关产品推荐

