计算一串数字中每个数字出现的次数

计算一串数字中每个数字出现的次数,可以这样子,先判断输入的字符串是不是数字组成,还是否包含有其它字符。

接下来拆分这一串字符串,每个字符插入一个表变量中,最后使用GROUP BY进行分组。

ExpandedBlockStart.gif CalNumOfChtInStr
SET ANSI_NULLS  ON
GO
SET QUOTED_IDENTIFIER  ON
GO
--  =============================================
--
 Author:        Insus.NET
--
 Create date: 2012-02-23
--
 Description:    Calculate the number of characters in the string
--
 =============================================

CREATE  PROCEDURE  [ dbo ]. [ CalNumOfChtInStr ]
(
     @Value  NVARCHAR( MAX)
)
AS
BEGIN
     DECLARE  @dum  TABLE ( [ Str ]  NVARCHAR( 2))
     DECLARE  @I  INT  =  LEN( @Value), @J  INT  =  LEN( @Value)
     WHILE  @I  >  0
     BEGIN
         -- 以下函数可参考:http://www.cnblogs.com/insus/archive/2011/06/25/2090231.html
         IF  [ dbo ]. [ IsInteger ] ( SUBSTRING( @Value@I1))  =  0
         BEGIN            
             RAISERROR( ' 传入字符串包含其它字符,不完全是数字。 ', 16, 1)            
             RETURN
         END    
         SET  @I  =  @I  -  1
     END
    
     WHILE  @J  >  0
     BEGIN 
         INSERT  INTO  @dum  VALUES( SUBSTRING( @Value@J1))
         SET  @J  =  @J  -  1
     END
    
    SELECT  [ Str ], COUNT( [ Str ]AS  [ Num ]  FROM  @dum  GROUP  BY  [ Str ] 
END

 

 Demo:

EXECUTE  [ dbo ]. [ CalNumOfChtInStr ]  ' 5487554127489423454 '

 

结果:

 

以下文字更新于2012-02-24 09:40

分析以上的存储过程,考虑到性能问题,它在判断是否包含有其它字符时,循环一次字符串,然后又循环一次将每一个字符插入表变量中。以下修改正此点只做循环一次。

ExpandedBlockStart.gif CalNumOfChtInStr
SET ANSI_NULLS  ON
GO
SET QUOTED_IDENTIFIER  ON
GO
--  =============================================
--
 Author:        Insus.NET
--
 Create date: 2012-02-23
--
 Update date: 2012-02-24
--
 Description:    Calculate the number of characters in the string
--
 =============================================

ALTER  PROCEDURE  [ dbo ]. [ CalNumOfChtInStr ]
(
     @Value  NVARCHAR( MAX)
)
AS
BEGIN
     DECLARE  @dum  TABLE ( [ Str ]  NVARCHAR( 2))   
     DECLARE  @I  INT  =  LEN( @Value)
     WHILE  @I  >  0
     BEGIN
        INSERT  INTO  @dum  VALUES( SUBSTRING( @Value@I1))
         SET  @I  =  @I  -  1
     END
    
     -- 以下函数可参考:http://www.cnblogs.com/insus/archive/2011/06/25/2090231.html
     IF  EXISTS( SELECT  TOP  1  1  FROM  @dum  WHERE  [ dbo ]. [ IsInteger ]( [ Str ]=  0)
     BEGIN            
         RAISERROR( ' 传入字符串包含其它字符,不完全是数字。 ', 16, 1)            
         RETURN
     END 
         SELECT  [ Str ], COUNT( [ Str ]AS  [ Num ]  FROM  @dum  GROUP  BY  [ Str ] 
END

 

以下内容于2012-04-29 10:44分添加:

 如果想参考C#版本:http://www.cnblogs.com/insus/archive/2012/04/29/2475988.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值