我正在使用 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 '
,第二个是'
。
我必须使用SUBSTRING
和CHARINDEX
,但无论如何我无法实现它。
我尝试了什么
有样本数据和我尝试过的内容,但没有成功:
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), '')))
答案 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'