【问题标题】:Extract variable length substring from string从字符串中提取可变长度子字符串
【发布时间】:2017-03-21 16:06:14
【问题描述】:

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

例子:

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

【问题讨论】:

  • 你使用的是什么 dbms?
  • sql server 2016
  • 向我们展示示例数据和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • 这是输入数据还是存储数据?为什么是这种格式?
  • 这是存储的数据。我不确定为什么它以这种格式存储,但我无权更改事务系统,因为那将是理想的情况。

标签: sql sql-server-2016


【解决方案1】:

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

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]

【讨论】:

  • @js1229 不客气。请不要忘记投票/将答案标记为正确。奖励让我有动力回来:)
  • 这很好用,但我如何将 shp、sld 等后超过 4 个字符的字符也包含到查询中?
  • @js1229 你什么意思?您能否更新您的问题并提供更多详细信息?
  • 太棒了!谢谢
猜你喜欢
  • 2015-08-17
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
相关资源
最近更新 更多