2017-04-15 8 views
1

"QuestionTags"の5番目の列にあるすべてのペア< ....の間の文字列を選択しようとしています。ここSQLサーバーのデータフィールドから文字列を抽出しています

は、データのサンプルです:

enter image description here

私はCHARINDEX機能を使用しますが、それは私の整数を返されました。

SUBSTRINGも使用しましたが、文字インデックスと文字列の長さを定義するように求められます。

提案がありますか?

+0

これらの組み合わせを使用して、目的の結果を表示することができます。 – TriV

+0

どうすればそれらを組み合わせることができますか? – Taie

+0

文字列として値のリストを格納しないように、データ構造を修正する必要があります。 –

答えて

2

あなたはこのためのSQL Server 2016を使用することができるなら、あなたは、SEのデータを使用しているように見えるようStack Exchange Data Explorer

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

仕事のデモを行いますstring_split機能に組み込まれています。

+0

ここで 'STUFF()'の代わりに 'SUBSTRING()'を選択する理由はありますか? –

+0

@GordonLinoffは個人的な好みです。私はそれがはっきりしていることを知っ –

2

あなたはテーブル値-機能に開いている場合ではなく、文字列(CHARINDEX、左、右、部分文字列を、...)を抽出するのはうんざり2016年

を使用して、私はパース/ Split関数を修正2つの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,'[[',']]') 
*/ 
+0

@ジョンCappelletti。 2番目の方法を使用すると、エラーメッセージが表示されます。 'A'付近の構文が正しくありません – Taie

+0

@Taie UDFを適用/作成しましたか? –

+0

はいテーブル値関数に関するUDFメソッド – Taie

関連する問題