获取两个不同字符串之间的字符串的一部分

时间:2017-10-25 08:26:22

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

我正在使用 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个空格,单引号将为一些文本。

所以看起来我在两个字符之间看,第一个是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), '')))

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分:0)

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)

答案 2 :(得分:0)

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

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'