2017-11-08 17 views
0

にREPLACE()関数を使用した後、私は、私はすべてのタグを削除するには、REPLACE関数を使用していSQL-Serverの:複数行に分割選択値は、結果

1.<content><value>foo</value><value>bar</value></content> 
2.<content><value>value3</value><value>value4</value></content> 

のような値を含むテーブルを持って(コンテンツおよび値)と私は;

select CAST(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(CAST(TEXTVALUE as NVarchar(MAX)) 
,'<content>',''),'<value>','') 
,'</value>',';') 
,' ','') 
,'</content>','') 
AS NText) from dbo.mytable ... 

私のSELECT文の出力に</value>を置き換える値を区切るためには、次のようになります

1.foo;bar 
2.value3;value4 

しかし - 私は、値ごとに新しい行を返すために、このselect文を分割したいと思います:

1. foo 
2. bar 
3. value3 
4. value4 

私は複数行にselect文の結果を分割して答えとメソッドをたくさん見てきました、最初に値の一部を置き換え、その結果を文字ごとに複数の行に分割する方法はありませんでした。

ここで私を助けてくれることを願っています。

編集:ありがとうございました。追加することを忘れて、同じリクエスト内の他の列も選択できるようにしたいと思います。

+1

です。 –

+0

SQL Server 2016以降で[STRING_SPLIT関数](https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql)を使用することもできます。 。 – kirchner

答えて

1

ルート要素の内部XML文字列を追加し、XML nodes方法

SELECT id,Split.a.value('.', 'VARCHAR(100)') 
FROM (SELECT Cast(xmlcol AS XML) AS data,id 
     FROM Yourtable) a 
     CROSS apply Data.nodes ('content/value') AS Split(a) 
+0

Splendid。ありがとう! xmlcolumnだけでなく、同じテーブルのidカラムを選択したい場合、このクエリを適切に更新するにはどうすればよいですか? – Goot

+0

@Goot - 今すぐ確認.. –

0

これはトリックを行う必要があります。ここでは

SELECT STRING_SPLIT(Sub.NText, ';') FROM 
    (select CAST(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(CAST(TEXTVALUE as NVarchar(MAX)) 
    ,'<content>',''),'<value>','') 
    ,'</value>',';') 
    ,' ','') 
    ,'</content>','') 
    AS NText) from dbo.mytable) AS Sub 
+1

SQL Server 2016+が必要です - 私たちは、使用しているバージョンをOPに尋ねる必要があります。 –

+0

あなたがSQL Server 2016でない場合は、この記事をチェックしてください。https://stackoverflow.com/questions/5493510/turning-a-comma-separated-string-into-individual-rows – jabko87

0

を使用して1つの方法です。このように

<root><content><value>foo</value><value>bar</value></content><content><value>value3</value><value>value4</value></content></root> 

declare @xmlPath xml = '<root><content><value>foo</value><value>bar</value></content><content><value>value3</value><value>value4</value></content></root>'; 
SELECT 
    p.value('(text())[1]', 'VARCHAR(8000)') AS value 
FROM @xmlPath.nodes('/root/content/value') AS a(p) 

XML要素文字列を置換する必要はありません。

でもこれを使用できます。あなたがテーブルに値を取得している場合。 textstringは==あなたがXML機能を調査する必要があり、フィールド名

SELECT 
    p.value('(text())[1]', 'VARCHAR(8000)') AS value 
FROM #tempTable temp 
CROSS APPLY textstring.nodes('/content/value') AS a(p) 
関連する問題