【问题标题】:Finding unique characters from a table field for all rows从表字段中查找所有行的唯一字符
【发布时间】:2013-04-03 10:14:19
【问题描述】:

如何查找具有多行的字段中使用的不同字符的数量。

例如,如果有两行包含abcdeaafg* 之类的数据,则使用的不同字符是abcdefg*

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    试试这个 -

    INSERT INTO @temp (txt)
    VALUES ('abcd3'), ('abcdefg*')
    
    SELECT disword = (
    SELECT DISTINCT dt.ch
    FROM (
     SELECT ch = SUBSTRING(t.mtxt, n.number + 1, 1) 
     FROM [master].dbo.spt_values n
     CROSS JOIN (
      SELECT mtxt = (
       SELECT txt
       FROM @temp
       FOR XML PATH(N''), TYPE, ROOT).value(N'root[1]', N'NVARCHAR(MAX)'
      )
     ) t
     WHERE [type] = N'p'
      AND number <= LEN(mtxt) - 1
    ) dt
    FOR XML PATH(N''), TYPE, ROOT).value(N'root[1]', N'NVARCHAR(MAX)'
    )
    

    示例(已编辑):

    SET NOCOUNT ON;
    
    DECLARE @temp TABLE (txt VARCHAR(8000))
    
    INSERT INTO @temp (txt)
    VALUES ('abcd'), ('abcdefg*'), (REPLICATE('-', 8000)), (REPLICATE('+', 8000))
    
    DECLARE @t TABLE (i BIGINT)
    
    DECLARE 
          @i BIGINT = 1
        , @l BIGINT = (
            SELECT SUM(LEN(txt))
            FROM @temp 
        )
    
    WHILE (@i <= @l) BEGIN
    
        INSERT INTO @t (i) 
        VALUES (@i), (@i+1), (@i+2), (@i+3), (@i+4), (@i+5), (@i+6), (@i+7), (@i+8), (@i+9)
        SELECT @i += 10
    
    END
    
    SELECT disword = (
        SELECT DISTINCT dt.ch
        FROM (
            SELECT ch = SUBSTRING(t.mtxt, n.i, 1) 
            FROM @t n
            CROSS JOIN (
                SELECT mtxt = (
                    SELECT txt
                    FROM @temp
                    FOR XML PATH(N''), TYPE, ROOT).value(N'root[1]', N'NVARCHAR(MAX)'
                )
            ) t
        ) dt
        FOR XML PATH(N''), TYPE, ROOT).value(N'root[1]', N'NVARCHAR(MAX)'
    )
    

    看看这个解决方案 -

    SELECT 
          dt.ch
        , cnt = COUNT(1)
    FROM (
        SELECT ch = SUBSTRING(t.mtxt, n.i, 1)  
        FROM @t n
        CROSS JOIN (
            SELECT mtxt = (
                SELECT txt
                FROM @temp
                FOR XML PATH(N''), TYPE, ROOT).value(N'root[1]', N'NVARCHAR(MAX)')
        ) t
    ) dt
    WHERE dt.ch != ''
    GROUP BY dt.ch
    ORDER BY cnt DESC
    

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      有理货:

      DECLARE @t TABLE (s NVARCHAR(MAX))
      
      INSERT INTO @t
      VALUES ('abcd'), ('abcdefg*')
      
      ;WITH tally AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) i
      FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t1(n)
      CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t2(n))
      
      SELECT 
      (       SELECT DISTINCT sb
              FROM    tally
              CROSS APPLY ( SELECT SUBSTRING(s, i, 1) sb FROM @t ) ca
              WHERE   sb <> ''
      FOR     XML PATH(N'') , TYPE , ROOT).value(N'root[1]', N'NVARCHAR(MAX)')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-06
        • 2012-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        • 2016-09-26
        相关资源
        最近更新 更多