SQL Server将列的XML值解析为表(对于每一行)

时间:2017-12-04 09:54:22

标签: sql-server xml

很抱歉,如果主题不是很清楚,但这是我需要完成的事情。我有一张这样的桌子:

componentDidMount

我需要为每个用户获取朋友的数量(即,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" />

以下SQL可以一次为一列执行此操作,但我不确定如何一次性对所有列执行此操作。

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

结果如下表所示:

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);

2 个答案:

答案 0 :(得分:2)

如果是 SQL Server ,您可以使用XQuery count函数:

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

MySQL - ExtractValue()

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

答案 1 :(得分: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?