You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:47:00