记录列包含char(x)的位数

时间:2015-03-06 23:52:28

标签: sql sql-server count char character

对于所有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

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

非常感谢。

1 个答案:

答案 0 :(得分:2)

试试这个基于SET的方法

使用Recursive CTE生成数字。

然后使用cross apply查找列中每个count的{​​{1}}。在一次性镜头中,您可以找到所有char计数,并且在500万条记录中也char插入而不是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) 而不是其他方法。查看here了解详情