sql - 从字符串中提取可变长度子字符串

标签 sql sql-server-2016

我正在尝试提取文本字符串并将其分成多列,但由于长度可变,我遇到了问题。

示例:

SHP123-SLD2345-DIV67-CRP89999-SUP-1234124
SHP1234-SLD234-DIV678-CRP0987-SUP-012

我想将字符串分成 5 列; shp、sld、div、crp、sup

我也有一些奇怪的行,类似这样;

 SHP12345-SLD23431-DIV4231-CRP432432-SUP-123-hello

“123-hello”仍将被视为 SUP。

预期的输出将与此类似:

SHP123
SLD2345
DIV67
CRP89999
SUP-1234124

SHP1234
SLD234
DIV678
CRP0987
SUP-012

最佳答案

这应该可以满足您的需求:

declare @var nvarchar(max) = 'SHP12345-SLD2345987-DIV67-CRP89999-SUP-1234124'
--declare @var nvarchar(max) = '123-hello'

select
    @var
    , case when charindex('shp', @var, 0) <> 0
            then substring(@var, charindex('shp', @var, 0), charindex('-', @var, charindex('shp', @var, 0)) - charindex('shp', @var, 0)) 
        else NULL
        end [shp]
    , case 
        when charindex('sld', @var, 0) <> 0
            then substring(@var, charindex('sld', @var, 0), charindex('-', @var, charindex('sld', @var, 0)) - charindex('sld', @var, 0))
        else NULL
        end [sld]
    , case 
        when charindex('div', @var, 0) <> 0
            then substring(@var, charindex('div', @var, 0), charindex('-', @var, charindex('div', @var, 0)) - charindex('div', @var, 0))
        else NULL
        end [div]
    , case 
        when charindex('crp', @var, 0) <> 0
            then substring(@var, charindex('crp', @var, 0), charindex('-', @var, charindex('crp', @var, 0)) - charindex('crp', @var, 0))
        else NULL
        end [crp]
    , case 
        when charindex('sup', @var, 0) <> 0
            then substring(@var, charindex('sup', @var, 0), len(@var) + 1)
        else @var
    end [sup]

关于sql - 从字符串中提取可变长度子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42932408/

相关文章:

mysql - SQL 效率 - MySQL Case/sub 选择

mysql - JOIN 中的随机元素

sql - 如何在sql server中将119.305.1983984.1转换为1.1983984.305.119?

sql - 删除 SQL 中的重复行

tsql - Windows 函数内部除以 0 错误

sql - 任务调度的数据库设计

SQL 代理无法处理系统日期更改?

sql - 在不使用 sql 中的关键字 DISTINCT 的情况下查找列中的不同元素

json - 当源未格式化为集合时使用 OPENJSON

sql-server - 无法安装 SSMS : A pending restart is blocking setup from completing