Sql 列包含字符(x)的记录计数
我需要计算varcharx列中包含特定字符的所有ASCII字符1-255的记录数。这就是我到目前为止在一个过程中所做的Sql 列包含字符(x)的记录计数,sql,sql-server,count,char,character,Sql,Sql Server,Count,Char,Character,我需要计算varcharx列中包含特定字符的所有ASCII字符1-255的记录数。这就是我到目前为止在一个过程中所做的 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 MyTa
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条记录包含CHAR1,X条记录包含CHAR2,等等,但是查询大约需要几分钟才能完成500万条记录,因为我猜它必须遍历每个记录255次。有没有关于更高效/更快的方法的建议
非常感谢。试试这种基于集合的方法
使用递归CTE生成数字
然后使用cross apply查找列中每个字符的计数。在一次快照中,您可以找到所有的字符数,在500万条记录中,也可以找到单个插入而不是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)
注意:有很多方法可以生成数字,因为这里的计数非常少,我选择递归CTE而不是其他方法。查看更多信息