统计一个字符在字符串里出现的次数
背景
在数据库操作中,统计字符串中某个特定字符出现的次数是一个常见需求。
无论是分析文本数据、格式化字符串,还是确保数据一致性,字符出现次数的统计对于开发人员和数据库管理员来说都是一项重要任务。
这个问题看似简单,但可以通过数据库管理系统的内置函数高效解决,避免复杂的循环或手动计数。
MySQL 和 SQL Server 都提供了简便的方法,通过字符串长度函数和替换操作的结合,快速实现字符统计。
MySQL 实现字符统计
在 MySQL 中,可以使用 LENGTH() 函数来获取字符串的长度,然后通过 REPLACE() 函数将目标字符替换为空,最后再计算替换后的字符串长度。两者相减即可得到目标字符的出现次数。
SELECT LENGTH('abc-abc-abc') - LENGTH(REPLACE('abc-abc-abc', 'a', '')) AS 'count';
结果
+---------------------------------------------------------+ | count | +---------------------------------------------------------+ | 3 | +---------------------------------------------------------+ 1 row in set (0.00 sec)
解释:
LENGTH(‘abc-abc-abc’) 返回字符串的总长度,即 11 个字符。
REPLACE(‘abc-abc-abc’, ‘a’, ”) 将字符串中的字母 ‘a’ 替换为空字符,结果为 “bc-bc-bc”,其长度为 8。
两者相减,结果就是字符 ‘a’ 出现的次数:11 – 8 = 3。
封装为存储过程
接受字符串和多个字符,然后逐个输出每个字符的出现次数。
DELIMITER // CREATE PROCEDURE count_chars_in_string(IN str TEXT, IN chars TEXT) BEGIN -- 声明变量 DECLARE i INT DEFAULT 1; DECLARE single_char CHAR(1); -- 创建临时表保存结果 CREATE TEMPORARY TABLE IF NOT EXISTS char_count ( `char` CHAR(1), `occurrence` INT ); -- 清空临时表 DELETE FROM char_count WHERE 1-1; -- 循环遍历每个字符 WHILE i LENGTH(chars) DO SET single_char = SUBSTRING(chars, i, 1); -- 插入当前字符及其出现次数到临时表 INSERT INTO char_count (`char`, occurrence) SELECT single_char, (LENGTH(str) - LENGTH(REPLACE(str, single_char, ''))); SET i = i + 1; END WHILE; -- 最后查询临时表中的所有结果 SELECT * FROM char_count ; -- 删除临时表 DROP TEMPORARY TABLE IF EXISTS char_count; END // DELIMITER ;
调用存储过程
CALL count_chars_in_string('abc-abc-abc', 'ab-');
这个存储过程 count_chars_in_string 通过循环遍历 chars 中的每个字符,计算它们在 str 中的出现次数,然后用临时表保存输出结果。
REPLACE 函数用于移除特定字符并通过长度差计算出现次数。
因为MySQL的存储过程循环执行select输出,只有最后一个select循环才会输出,所以这里只能用临时表保存之前循环的结果
SQL Server 实现字符统计
SQL Server 中,同样可以使用 LEN() 函数和 REPLACE() 函数来完成相同的操作。注意,SQL Server 中的 LEN() 函数计算字符串长度时不会包括末尾的空格。
SELECT LEN('abc-abc-abc') - LEN(REPLACE('abc-abc-abc', 'a', '')) AS 'count';
结果
count ----- 3
解释:
LEN(‘abc-abc-abc’) 返回字符串的长度为 11。
REPLACE(‘abc-abc-abc’, ‘a’, ”) 将所有的 ‘a’ 替换为空,剩下的字符串 “bc-bc-bc” 长度为 8。
两者相减,得到字符 ‘a’ 出现的次数:11 – 8 = 3。
封装为存储过程
接受字符串和多个字符,然后逐个输出每个字符的出现次数。
CREATE PROCEDURE dbo.CountCharsInString @str NVARCHAR(MAX), @chars NVARCHAR(MAX) AS BEGIN DECLARE @i INT = 1; DECLARE @single_char CHAR(1); -- 循环遍历每个字符 WHILE @i LEN(@chars) BEGIN SET @single_char = SUBSTRING(@chars, @i, 1); -- 输出当前字符及其出现次数 SELECT @single_char AS character, (LEN(@str) - LEN(REPLACE(@str, @single_char, ''))) AS occurrence; SET @i = @i + 1; END END;
调用存储过程
EXEC dbo.CountCharsInString 'abc-abc-abc', 'a-b';
这个存储过程 CountCharsInString 使用 WHILE 循环逐个字符处理 @chars 中的字符,并输出它们在 @str 中的出现次数。
通过 REPLACE 函数计算每个字符出现的次数。
SQL Server要比MySQL强大,不需要临时表,每次select都可以输出结果
总结
无论是 MySQL 还是 SQL Server,统计字符串中某个字符出现的次数都非常简单。通过利用字符串的长度差异,我们可以快速得到结果。
对于那些需要高效进行字符统计的场景,这种方法无疑是快捷且实用的。
用户可以根据实际需求将这个方法应用到更复杂的查询中,甚至可以将其封装成函数,方便日后的使用。
参考文章
https://news.west.cn/39450.html
https://e.huawei.com/cn/industries/commercial-market/active-active-data-center-solution
https://stor.zol.com.cn/374/3741281.html
https://blog.csdn.net/hjx020/article/details/106588133/
本文版权归作者所有,未经作者同意不得转载。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容