【问题标题】:SQL Server using Substring and Charindex when string variesSQL Server 在字符串变化时使用 Substring 和 Charindex
【发布时间】:2017-07-28 08:42:31
【问题描述】:

我正在做一个从字符串中提取特定数据元素的小项目。字符串示例:

ABC:123-456-789-1234 description end 1/1/2015

我要提取的部分是123-456-789-1234。现在我有以下 SQL 来选择该数据元素:

SELECT substring(data, charindex('ABC',data)+4,16) FROM Table X

问题是字符串变化很大。例如,以下是字符串的提供方式:

ABC: 123-456-789-1234 description end 1/1/2015
ABC:  123-456-789-1234 da1234 
ABC:  123-456-789-1234 random1234-12 1/1/2015
ABC:  123-456-789-1234,-ing  end 1/1/2015
ABC 123-456-789-1234 description end 

有没有更好的方法来捕获我想要的确切数据元素?我无法将值硬编码到子字符串中。

编辑:应该澄清字符串在所有实例中都不相同(即单词描述或日期是可选的)

编辑:找到答案。需要替换所有内容并提取相关信息。

SELECT substring(replace(replace(replace(data,' ',''),'-',''),':',''), charindex('ABC',replace(replace(replace(data,' ',''),'-',''),':',''))+3,13)

【问题讨论】:

  • 我不是很好,但也许使用正则表达式

标签: sql sql-server string tsql


【解决方案1】:

编辑:针对新数据更新

declare @YourTable table (data varchar(300));
insert into @YourTable values
('ABC: 123-456-789-1234 description end 1/1/2015'),
('ABC:  123-456-789-1234 da1234'), 
('ABC:  123-456-789-1234 random1234-12 1/1/2015'),
('ABC:  123-456-789-1234,-ing  end 1/1/2015'),
('ABC 123-456-789-1234 description end') 

Select stuff(left(data,patindex('%-[0-9][0-9][0-9][0-9]%',data)+4),1,patindex('%[0-9]%',data)-1,'')
 From @YourTable

返回

(No column name)
123-456-789-1234
123-456-789-1234
123-456-789-1234
123-456-789-1234
123-456-789-1234

【讨论】:

    【解决方案2】:

    使用 patindex 而不是 charindex 来查找字符串中出现的第一个数字,并将字符串从该数字剪切到 description 单词(带空格字符)开始:

    SELECT substring(data, patindex('%[0-9]%', data), patindex('% description%', data) - patindex('%[0-9]%', data)) FROM Table X
    

    数据值更新后:

    select substring(a.data, 1, patindex('%[^0-9-]%', a.data)-1) from ( SELECT substring(data, patindex('%[0-9]%', data), len(data)) as data FROM Table X ) a

    【讨论】:

    • 应该澄清描述文本也有所不同。请查看我的更新值
    【解决方案3】:

    这可行,但我不知道它是否是您正在寻找的:

    查看:http://rextester.com/VSRU64720

    declare @txt table (data varchar(300));
    insert into @txt values
    ('f df df d ABC: 123-456-789-1234 description end 1/1/2015'),
    ('adf d fdf d  ABC:  123-456-789-1234 description end 1/1/2015'),
    ('adf ad fdas d ABC 123-456-789-1234 description end 1/1/2015');
    
    with ctMsg as
    (
        select substring(data, charindex('ABC',data), len(data) - charindex('ABC',data) + 1) as msg
        from @txt
    )
    select substring(msg, patindex('%[0-9]%', msg), 16)
    from ctMsg;
    

    返回:

    123-456-789-1234
    123-456-789-1234
    123-456-789-1234
    

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      相关资源
      最近更新 更多