【问题标题】:Record counts where column contains char(x)列包含 char(x) 的记录计数
【发布时间】:2023-03-15 15:02:01
【问题描述】:

对于所有 ASCII 字符 1-255,我需要计算列 (varchar(x)) 包含特定字符的记录数。这就是我到目前为止所拥有的(在一个过程中)......

DECLARE @CHAR TINYINT = 1
CREATE TABLE #CHARCOUNTS  (CHAR TINYINT, COUNT INT)

WHILE @CHAR < 255

BEGIN
    INSERT INTO #CHARCOUNTS(CHAR, COUNT) VALUES (@CHAR,(SELECT COUNT (ID) FROM MyTable WHERE CHARINDEX(CHAR(@CHAR), MyColumn) > 0))
    SET @CHAR = @CHAR + 1
END 

SELECT CHAR, COUNT FROM #CHARCOUNTS

这返回一个结果集,告诉我有 X 记录包含 CHAR(1),X 记录包含 CHAR(2) 等等,但是查询需要几分钟才能完成大约 500 万条记录,因为我猜它必须遍历每条记录 255 次。对更有效/更快的方法有什么建议吗?

非常感谢。

【问题讨论】:

    标签: sql sql-server count char character


    【解决方案1】:

    试试这个基于集合的方法

    使用Recursive CTE 生成数字。

    然后使用cross apply 在您的列中找到每个charcount。在一次拍摄中,您可以找到所有 char 计数,并且在 500 万条记录中还可以找到 single 插入而不是 255 插入,因此这将具有更好的性能。

    ;WITH cte
         AS (SELECT 1 chars
             UNION ALL
             SELECT chars + 1
             FROM   cte
             WHERE  chars < 255)
    INSERT INTO #CHARCOUNTS
                (CHAR,COUNT)
    SELECT chars,
           [count]
    FROM   cte
           CROSS apply (SELECT Count (ID) [count]
                        FROM   MyTable
                        WHERE  Charindex(Char(chars), MyColumn) > 0) cs
    OPTION (maxrecursion 256) 
    

    注意:有很多方法可以生成数字,因为这里的计数非常少,我选择Recursive CTE 而不是其他方法。查看here了解更多信息

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      相关资源
      最近更新 更多