7-6 统计字符串中数字字符的个数_SQL小技巧解决大问题:如何统计字符出现次数?...

朋友们,我们在写SQL脚本时,经常会碰到一些个看似简单、却无从下手的问题,这类问题说大不大、说小也不小,经常会搞的我们很头痛。

45faa7c8f5f14dea90e8df4de2d71844.png

比如,如何使用SQL语句统计字符在某个字符串中出现的次数?这就是个看似简单的问题,遍查SQL支持的字符串函数(至少在MSSQL中),并没有发现有直接可用的函数。

其实,绝大部分情况下,只要我们学会了变通,很多让我们苦恼的问题很容易就迎刃而解了。不信请您往下看。

不变通也能解决问题,虽然复杂,但用到的技术都是基本功

因为没有相应的内置函数,大部分朋友首先想到的是:把整个字符串按照字符位置遍历,一个个匹配。这种方法应该是大部分朋友们首先会想到的方法。

这个方法当然肯定可行,因为笔者以前就这样干过。我把曾经写过的脚本改造下贴出来,您看看多麻烦:

46ded52f8f6cd7da6e89ab7559b23484.png
--定义变量declare @pos bigint=1;declare @len bigint;declare @char nvarchar(1);declare @text nvarchar(max);declare @val varchar(max)=space(0);declare @count bigint=0;--初始化一些变量set @text=N'印度嚣张、越南阴险、美国霸道、中国低调、、、';set @len=len(@text);--统计“、”出现个数while @pos<=@len begin --将所有的部分循环完全 set @char=substring(@text,@pos,1) if @char='、' set @count+=1; set @pos=@pos+1 --end--显示个数print @count;

上面的代码段,主要用来统计字符串@text中包含的“、”的个数,下图是执行的效果:

a70f54eb618cd4829d299d594b849192.png

为了统计“、”的个数,需要通过while循环,将字符串中所有字符做一次遍历,获取每个位置字符使用的是substring函数,通过变量@pos记录当前字符的位置,循环一次,该变量累加1表示位置后移一位。

这种方法虽然挺复杂,但所用到的都是SQL的基础知识,当然也需要一定的SQL功底,不管您喜不喜欢,最起码您要能看得懂这类代码对吧。

这种方式除了麻烦,还有致命缺点,比如,有时我们需要在某条SQL脚本中、根据某个字段中含有某个字符的个数来做排序或判断,这种方法就麻烦了,您需要写成自定义函数调用才行。

世上本无事、庸人自扰之,我下面为您提供一种变通方式,一条脚本实现之。

变通方法需要灵活变通,需要您换换思考的方式!

f512930714ffdbd1c0d7478dbf61aaba.png

正向思维中,查找字符串中包含的某个字符的个数,当然是通过遍历挨个对比。其实我们可以采用逆向思维:如果我们把要找的字符从字符串中全部干掉,那字符串减少的长度不就是包含的个数么?!

如何干掉待查找字符呢?这就要用到另一个字符串处理函数replace。脚本如下:

declare @text nvarchar(max)=N'印度嚣张、越南阴险、美国霸道、中国低调、、、';select len(@text)-len(replace(@text,'、',space(0)));

简单吧,我们使用字符串长度减去替换成space(0)之后的长度,不正是“、”出现的次数么?

下面是运行效果:

8ffe827691f063b733e4e9f8721d9c09.png

与第一种方法相比,第二种方法可谓是简单快捷、殊途同归。很多时候我们需要将结果嵌入在SQL中,比如在where条件中、排序时等,如果用到该个数做判断或排序,您就只能用第二种方法、或者将第一种脚本改成自定义函数来调用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值