SQL Server 2008 R2字符匹配统计:如何正确计算问号出现次数?
嗨,我来帮你搞定这个统计问号次数的问题!
首先咱们先分析下你那两种方法为啥没得到预期结果:
- 方法1的问题:你得到9的结果,大概率是变量名搞混了(比如你在方法2里用了
@SDPattern,是不是实际运行时把变量名写错了?),或者不小心覆盖了原模式变量。按你给出的模式' ??? ? ?? ',正确的LEN(@Pattern) - LEN(REPLACE(@Pattern,'?',''))应该等于6才对。另外,你直接把计算结果赋值回@Pattern,会覆盖原字符串,这也容易导致后续出错。 - 方法2的问题:这个逻辑本身就不对——它只是计算了去除首尾空格后的字符串长度,根本没统计问号的数量。你得到的8是去空格后的模式
'??? ? ??'的总长度,自然和预期的问号次数无关。
接下来给你正确的解决方法,核心思路还是用「原字符串长度 - 替换掉所有问号后的字符串长度」,但要注意变量的正确使用:
DECLARE @Pattern VARCHAR(20) = ' ??? ? ?? '; -- 用单独的变量存储统计结果,避免覆盖原模式 DECLARE @QuestionMarkCount INT; SET @QuestionMarkCount = LEN(@Pattern) - LEN(REPLACE(@Pattern, '?', '')); PRINT @QuestionMarkCount; -- 这里会输出预期的6
为啥这个方法有效?咱们拆解下:
LEN(@Pattern)得到原字符串的总长度:你的模式是' ??? ? ?? ',数一下是1个开头空格+3个?+1个空格+1个?+1个空格+2个?+1个结尾空格,总长度是10。REPLACE(@Pattern, '?', '')会把所有问号替换成空字符串,剩下的是4个空格,长度是4。- 两者相减
10-4=6,正好是问号的出现次数。
如果你的实际场景里字符串是Unicode类型(比如NVARCHAR),记得用对应版本的函数,不过这里你的变量是VARCHAR,完全没问题。
内容的提问来源于stack exchange,提问作者MAK
相关产品推荐
相关产品推荐

