Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 列包含字符(x)的记录计数_Sql_Sql Server_Count_Char_Character - Fatal编程技术网

Sql 列包含字符(x)的记录计数

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

我需要计算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 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而不是其他方法。查看更多信息