在SQL的实际使用中,统计特定字符在字符串里的出现次数是很常见的需求,比如需要校验用户输入的内容格式、拆分字符串前统计分隔符数量等。利用LENGTH差值计算法可以快速实现这个需求,不需要编写复杂的自定义函数或者循环逻辑。

方法核心原理
这种方法的逻辑非常简单,主要分为两步:
- 第一步,计算原字符串的总长度,也就是包含目标字符的完整字符串长度。
- 第二步,将原字符串中所有的目标字符替换为空字符串,再计算替换后的字符串长度。
- 最后用原字符串长度减去替换后的字符串长度,得到的数值就是目标字符出现的次数。如果目标字符是单个字符,差值就是出现次数;如果目标字符是多个字符组成的字符串,差值需要除以目标字符的长度才是出现次数。
不同数据库的实现示例
MySQL数据库
MySQL中可以使用LENGTH函数获取字符串长度,使用REPLACE函数替换目标字符,示例代码如下:
-- 统计字符串"abc,def,ghi"中逗号出现的次数
SELECT
(LENGTH('abc,def,ghi') - LENGTH(REPLACE('abc,def,ghi', ',', ''))) AS char_count;
上述代码中,原字符串长度是11,替换逗号后的字符串是"abcdefghi",长度是9,差值为2,也就是逗号出现了2次,结果符合预期。
PostgreSQL数据库
PostgreSQL中LENGTH函数同样可以获取字符串长度,REPLACE函数的用法和MySQL一致,示例代码如下:
-- 统计字符串"test_test_demo"中下划线出现的次数
SELECT
(LENGTH('test_test_demo') - LENGTH(REPLACE('test_test_demo', '_', ''))) AS underline_count;
这里原字符串长度是14,替换下划线后的字符串是"testtestdemo",长度是12,差值为2,说明下划线出现了2次。
SQL Server数据库
SQL Server中需要使用LEN函数获取字符串长度,REPLACE函数用法和其他数据库类似,示例代码如下:
-- 统计字符串"hello world world"中"world"出现的次数
SELECT
(LEN('hello world world') - LEN(REPLACE('hello world world', 'world', ''))) / LEN('world') AS world_count;
因为目标字符"world"的长度是5,原字符串长度是17,替换后的字符串是"hello ",长度是7,差值为10,10除以5得到2,也就是"world"出现了2次。
注意事项
- 如果目标字符是多字符的字符串,一定要记得用差值除以目标字符的长度,否则得到的不是实际出现次数。
- 部分数据库的
LENGTH函数会统计字符串的字节数而不是字符数,如果是多字节字符(比如中文),需要确认数据库的函数逻辑,避免统计错误。 - 如果原字符串中不存在目标字符,替换后的字符串长度和原字符串长度一致,差值为0,结果也是正确的。
这种LENGTH差值计算法适合大多数常规场景,实现简单且执行效率高,不需要依赖数据库的复杂特性,兼容性也比较好。