代码之家  ›  专栏  ›  技术社区  ›  SP1

SQL Server中基于字符和计数划分字符串[重复]

  •  -1
  • SP1  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我有一张如下图所示的桌子

    DATA1

    Delta,Charlie
    Delta,Bravo
    Bravo,Charlie
    Tango,Bravo
    Alpha
    

    我想数一数单词。

    所以我想得到

    Delta 2
    Charlie 2
    Bravo 3
    Tango 1
    Alpha 1
    

    我的想法是创建一个临时表并基于、字符拆分字符串,并根据此处定义的函数将其插入临时表中: T-SQL split string 然后将它们分组并计数。有更好的方法吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   iSR5    6 年前

    不需要临时表,可以一次运行。

    请参见此示例:

    DECLARE 
        @tb TABLE (data1 VARCHAR(500) ) 
    
    INSERT INTO @tb VALUES 
    ('Delta,Charlie'),
    ('Delta,Bravo'),
    ('Bravo,Charlie'),
    ('Tango,Bravo'),
    ('Alpha')
    
    SELECT data1, COUNT(*) total
    FROM (
    SELECT LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) data1
    FROM (
        SELECT CAST('<XMLRoot><RowData>' + REPLACE(data1,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) split
        FROM @tb
    ) D
    CROSS APPLY split.nodes('/XMLRoot/RowData')m(n)
    ) D 
    GROUP BY data1
    

    更多解释 (根据SCSimon的要求)

    上面的方法是使用XML分割字符串的方法之一。基本上,我们所做的就是用XML标记替换实际数据中的逗号。 </RowData><RowData> 它定义了每个拆分,然后用另一个XML标记将其连接起来。 <XMLRoot><RowData></RowData></XMLRoot> 定义每一行。

    所以,例如,如果我们得到第一行 Delta,Charlie 它将被转换为:

    <XMLRoot>
        <RowData>Delta</RowData>
        <RowData>Charlie</RowData>
    </XMLRoot>  
    

    如果您知道XML结构是如何工作的,或者至少知道HTML(两者都有相似之处),那么您将得到这个想法。

    然后,我们使用SQL Server已经支持的XML技术,并选择节点(行),然后将其转换回 VARCHAR 作为单个值处理(常规行)。

    这是一个快速的解释,虽然有很多其他方法,其中一些也使用XML,但这取决于您的偏好。

    如果你需要其他技术,你可以 check this out 几乎涵盖了所有其他技术。(也是一篇好文章)。

    如果您使用的是SQL Server 2016或更高版本,则可以使用 STRING_SPLIT 函数,它将为您提供相同的结果。