2017-04-15 148 views
1

我試圖選擇每對之間的字符串< ....>在第五列「QuestionTags」中。從sql server中的數據字段中提取字符串

這裏是數據的一個樣本:

enter image description here

我使用CHARINDEX功能,但它返回我的整數。

我也使用SUBSTRING,但它要求我定義字符索引和字符串的長度。

有什麼建議嗎?

+0

你可以使用它們的組合,並顯示你想要的結果。 – TriV

+0

我如何結合他們? – Taie

+0

您應該修復您的數據結構,以便不將值列表存儲爲字符串。 –

回答

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數據。

+0

你有沒有理由在這裏選擇'SUBSTRING()'而不是'STUFF()'? –

+0

@GordonLinoff只是個人喜好。我發現它更清晰。 –

2

如果你是開放的表值函數且沒有使用2016年

厭倦提取字符串(CHARINDEX,左,右,子,...),我修改了一個解析/分割功能接受兩個不類似的分隔符。在你的情況下,<>

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,'[[',']]') 
*/ 
+0

@ John Cappelletti。使用第二種方法,它向我顯示一條錯誤消息:「A」附近的語法錯誤 – Taie

+0

@Taie您是否應用/創建UDF? –

+0

是UDF方法 – Taie