2017-12-04 6 views
1

申し訳ありませんが、トピックがあまり明確ではない場合は、ここで目的を達成する必要があります。私は、各ユーザのために友人の数(XMLノードのすなわち、数)を取得する必要がありますSQL Serverは列のXML値をテーブルに解析します(行ごとに)

user_id | friends 
============================== 
75   | <friend name="bob" /><friend name="joe" /> 
76   | <friend name="bill" /><friend name="bob" /> 
77   | <friend name="sam" /><friend name="gary" /><friend name="john" /> 

:私はそうのようなテーブルを持っています。 結果のテーブルには、次のようになります。

user_id | number_of_friends 
============================== 
75   | 2 
76   | 2 
77   | 3 

次のSQLは、一度に1つの列のためにそれを行うことができますが、私は一度にすべての列のためにそれを行うするかどうかはわかりません。

DECLARE @x XML; 

SELECT @x = pval 
FROM [mytable] 
WHERE uid=75 AND pkey='roster'; 

SELECT COUNT(t.c.value('@name', 'NVARCHAR(MAX)')) AS number_of_friends 
FROM @x.nodes('//friend') t(c); 

これは表の結果:

number_of_friends 
================= 
2 

答えて

2

それはあなたは、XQuery count機能を使用することができますSQL Serverのある場合:MySQLの

SELECT [user_id], 
     friends.value('count(/friend)','integer') as number_of_friends 
FROM YourTable 

を - ExtractValue()

SELECT `user_id`, 
     ExtractValue(`friends`, 'count(/friend)') 
FROM `YourTable` 
+0

私はこのエラーを受け取ります: '列" friends "またはユーザ定義関数を見つけられなかったり、" friends.value "を集めることができません。名前があいまいです。 – sme

+0

'friends'はXMLデータ型かvarcharですか?もしvarchar - あなたは 'CAST(xml friends).value( 'count(/ friend)'、 'integer')をnumber_of_friends'として使用する必要があります。 – gofr1

+0

ありがとう、お友達の列をXMLにキャストすることはやりました。それは今働く – sme

1

あなたはこのトリックを試すことができます:あなたが探しているもの(置き換え)を取り外し、文字列の長さの違いを比較します

SELECT 
    user_id,  
    ROUND (
     (
      LENGTH(friends) 
      - LENGTH(REPLACE (friends, "<friend", "")) 
     )/LENGTH("<friend")   
    ) AS count 
FROM friendtable 

Running fiddle

Count the number of occurrences of a string in a VARCHAR field?

+0

'friends'列は' ntext'ので、クエリでエラーが発生しました。 'nvarchar(max)'にキャストした後でも、各列は0の値を返します(Microsoft SQL Serverでは、 'length'関数は' len'、 'round'関数は複数のパラメータが必要です) – sme

+0

あなたはmysql – Chrille

+1

であなたの質問にタグを付けました申し訳ありません、タグを削除しました。私はあなたに+1を与えましたが、ありがとう – sme

関連する問題