【问题标题】:Get part of the string between 2 different strings获取2个不同字符串之间的部分字符串
【发布时间】:2018-04-06 06:05:24
【问题描述】:

我正在使用 SQL-Server 2008 R2

首先,我想告诉你的是,我知道这样存储字符串是非常糟糕的做法,但是作为 SQL 开发人员,我没有能力更改它,第三方生成的软件像这样输出和插入数据库。


说明

样本值如下:

Name: 'Document No. 996'
Unique No: 'A 54 x. 488sCHU'
No 2: 'RF123456789'
String 'This is dynamic text' value 'test' wrong data
Values 'ETC1 ETC2'.

注意:这是 1 个值(1 列,1 行)

如您所见,结构如下:在单词Name 之后添加: 然后用单引号,然后是一些文档号,在它之后换行等等。


我需要什么(期望的结果)

我需要从该字符串中提取这部分:String 'This is dynamic text'

这部分总是以单词String开头,后面是1个空格,单引号里是一些文字。

所以看起来我在 2 个字符之间查找,第一个是 String ',第二个是 '

我可能必须使用SUBSTRINGCHARINDEX,但无论如何我无法实现它。


我的尝试

有示例数据和我尝试过的,只是没有成功:

DECLARE @c varchar(100)
SET     @c = 'Name: ''Document No. 996''
Unique No: ''A 54 x. 488sCHU''
No 2: ''RF123456789''
String ''This is dynamic text'' value ''test'' wrong data
Values ''ETC1 ETC2''.'


SELECT SUBSTRING(STUFF(@c, 1, CHARINDEX('String ''',@c), ''), 0, CHARINDEX('''', STUFF(@c, 1, CHARINDEX('String ''',@c), '')))

【问题讨论】:

  • @YogeshSharma 想要的结果在What I need 部分。

标签: sql sql-server sql-server-2008 tsql substring


【解决方案1】:

你可以使用它

DECLARE @c varchar(1000)
SET     @c = 'Name: ''Document No. 996''
Unique No: ''A 54 x. 488sCHU''
No 2: ''RF123456789''
String ''This is dynamic text'' value ''test'' wrong data
Values ''ETC1 ETC2''.'


SELECT SUBSTRING( @c, CHARINDEX('String ''',@c) , CHARINDEX('''', @c, CHARINDEX('String ''',@c)+8  ) - CHARINDEX('String ''',@c)+1)

结果:

String 'This is dynamic text'

【讨论】:

    【解决方案2】:
    DECLARE @c varchar(255) --100 will truncate your string
    SET     @c = 'Name: ''Document No. 996''
    Unique No: ''A 54 x. 488sCHU''
    No 2: ''RF123456789''
    String ''This is dynamic text'' value ''test'' wrong data
    Values ''ETC1 ETC2''.'
    

    为了更好地理解,这里将解决方案分为两部分。第一部分是查找以String 关键字开头并一直到原始字符串结尾的子字符串。我们将它存储在@c1,以重复使用它两次。第二部分是找到下一个',但只在@c1 中并从中删除所有内容。

    DECLARE @c1 Varchar(255)
    SELECT @c1 =  SUBSTRING(@c, CHARINDEX('String ''',@c) + 8, 255)  
    --This is dynamic text' value 'test' wrong data  Values 'ETC1 ETC2'.
    
    SELECT LEFT(@c1, CHARINDEX('''',@c1) - 1)
    --This is dynamic text
    

    全部放在一起 - 在单个查询中:

    SELECT LEFT(SUBSTRING(@c, CHARINDEX('String ''',@c) + 8, 255), CHARINDEX('''',SUBSTRING(@c, CHARINDEX('String ''',@c) + 8, 255)) - 1)
    

    【讨论】:

      【解决方案3】:

      不确定,但您正在寻找如下内容:

      DECLARE @DATA NVARCHAR(MAX);
      
      SET @DATA = 'Name: ''Document No. 996''
      Unique No: ''A 54 x. 488sCHU''
      No 2: ''RF123456789''
      String ''This is dynamic text'' value ''test'' wrong data
      Values ''ETC1 ETC2''.';
      
      SELECT SUBSTRING(SUBSTRING(@DATA, CHARINDEX('String', @DATA), CHARINDEX('Values', @DATA)-CHARINDEX('String', @DATA)), 1, CHARINDEX('''', SUBSTRING(SUBSTRING(@DATA, CHARINDEX('String', @DATA), CHARINDEX('Values', @DATA)-CHARINDEX('String', @DATA)), CHARINDEX('''', SUBSTRING(@DATA, CHARINDEX('String', @DATA), CHARINDEX('Values', @DATA)-CHARINDEX('String', @DATA)))+1, LEN(SUBSTRING(@DATA, CHARINDEX('String', @DATA), CHARINDEX('Values', @DATA)-CHARINDEX('String', @DATA)))))+CHARINDEX('''', SUBSTRING(@DATA, CHARINDEX('String', @DATA), CHARINDEX('Values', @DATA)-CHARINDEX('String', @DATA))));
      

      结果:

      String 'This is dynamic text'
      

      【讨论】:

        猜你喜欢
        • 2015-02-18
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多