从sql server中的数据字段中提取字符串

时间:2017-04-15 14:36:58

标签: sql sql-server string

我正在尝试选择每对之间的字符串< ....>在第五栏" QuestionTags"。

这是一个数据样本:

enter image description here

我使用了CHARINDEX函数,但它返回了一个整数。

我也使用了SUBSTRING,但它要求我定义字符串索引和字符串长度。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

如果您对Table-Valued-Function开放而不使用2016。

厌倦了提取字符串(charindex,left,right,substring,...),我修改了Parse / Split函数来接受两个NON-LIKE分隔符。在您的情况下,< >

示例

Declare @YourTable table (ID int,QuestionTags varchar(max))
Insert Into @YourTable values
 (1,'<php><arrays><cloud><tag-cloud>')
,(2,'<windows><mailto>')

Select A.ID
      ,B.*
 From  @YourTable A
 Cross Apply [dbo].[udf-Str-Extract](A.QuestionTags,'<','>') B

<强>返回

ID  RetSeq  RetPos  RetVal
1   1       2       php
1   2       7       arrays
1   3       15      cloud
1   4       22      tag-cloud
2   1       2       windows     --<< Second Record
2   2       11      mailto

感兴趣的UDF

CREATE FUNCTION [dbo].[udf-Str-Extract] (@String varchar(max),@Delimiter1 varchar(100),@Delimiter2 varchar(100))
Returns Table 
As
Return (  

with   cte1(N)   As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
       cte2(N)   As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 N1,cte1 N2,cte1 N3,cte1 N4,cte1 N5,cte1 N6) A ),
       cte3(N)   As (Select 1 Union All Select t.N+DataLength(@Delimiter1) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter1)) = @Delimiter1),
       cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter1,@String,s.N),0)-S.N,8000) From cte3 S)

Select RetSeq = Row_Number() over (Order By N)
      ,RetPos = N
      ,RetVal = left(RetVal,charindex(@Delimiter2,RetVal)-1) 
 From  (
        Select *,RetVal = Substring(@String, N, L) 
         From  cte4
       ) A
 Where charindex(@Delimiter2,RetVal)>1

)
/*
Max Length of String 1MM characters

Declare @String varchar(max) = 'Dear [[FirstName]] [[LastName]], ...'
Select * From [dbo].[udf-Str-Extract] (@String,'[[',']]')
*/

答案 1 :(得分:2)

如果您可以使用SQL Server 2016,那么有一个内置的string_split函数可以完成这项工作

SELECT *
FROM   YourTable
       OUTER APPLY (SELECT SUBSTRING(value, 2, 8000) value
                    FROM   string_split(QuestionTags, '>')
                    WHERE  value <> '') OA 

Stack Exchange Data Explorer中的演示,因为您看起来正在使用SE数据。