我正在尝试提取一个文本字符串并将其分解为多个列,但由于存在可变长度,我遇到了问题。
示例:
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>'123-hello'仍将被视为SUP。
预期的输出将与此类似:
SHP123
SLD2345
DIV67
CRP89999
SUP-1234124
SHP1234
SLD234
DIV678
CRP0987
SUP-012
答案 0 :(得分:3)
这应该可以满足您的需求:
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]