博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算一串数字中每个数字出现的次数
阅读量:5815 次
发布时间:2019-06-18

本文共 1868 字,大约阅读时间需要 6 分钟。

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

接下来拆分这一串字符串,每个字符插入一个表变量中,最后使用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
        
--
以下函数可参考:
        
IF 
[
dbo
].
[
IsInteger
] (
SUBSTRING(
@Value
@I
1)) 
= 
0
        
BEGIN            
            
RAISERROR(
'
传入字符串包含其它字符,不完全是数字。
',
16,
1)            
            
RETURN
        
END    
        
SET 
@I 
= 
@I 
- 
1
    
END
    
    
WHILE 
@J 
> 
0
    
BEGIN 
        
INSERT 
INTO 
@dum 
VALUES(
SUBSTRING(
@Value
@J
1))
        
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
@I
1))
        
SET 
@I 
= 
@I 
- 
1
    
END
    
    
--
以下函数可参考:
    
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://igmbx.baihongyu.com/

你可能感兴趣的文章
MySQL出现Access denied for user ‘root’@’localhost’ (using password:YES)
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
UIImagePickerController拍照与摄像
查看>>
python调用windows api
查看>>
Linux内核中的printf实现【转】
查看>>
第四章 mybatis批量insert
查看>>
Java并发框架——什么是AQS框架
查看>>
【数据库】
查看>>
Win配置Apache+mod_wsgi+django环境+域名
查看>>
第四届中国汽车产业信息化技术创新峰会将于6月在沪召开
查看>>
linux清除文件内容
查看>>
WindowManager.LayoutParams 详解
查看>>
find的命令的使用和文件名的后缀
查看>>
Android的Aidl安装方法
查看>>
Linux中rc的含义
查看>>
曾鸣:区块链的春天还没有到来| 阿里内部干货
查看>>
如何通过Dataworks禁止MaxCompute 子账号跨Project访问
查看>>
js之无缝滚动
查看>>
Django 多表联合查询
查看>>