You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

为啥这个方法有效?咱们拆解下:

  1. LEN(@Pattern)得到原字符串的总长度:你的模式是' ??? ? ?? ',数一下是1个开头空格+3个?+1个空格+1个?+1个空格+2个?+1个结尾空格,总长度是10。
  2. REPLACE(@Pattern, '?', '')会把所有问号替换成空字符串,剩下的是4个空格,长度是4。
  3. 两者相减10-4=6,正好是问号的出现次数。

如果你的实际场景里字符串是Unicode类型(比如NVARCHAR),记得用对应版本的函数,不过这里你的变量是VARCHAR,完全没问题。

内容的提问来源于stack exchange,提问作者MAK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:48:45