sqlserver中正则表达式和分组查询
我有这样的一张表,2个字段,一个字段是编号,一个字段是数量,编号类似下面的样子aaa4587fd4344ddd5d2543565用正则表达式的规则表示就是\d{4},就是...
我有这样的一张表,2个字段,一个字段是编号,一个字段是数量,编号类似下面的样子
aaa4587fd
4344ddd5
d2543565
用正则表达式的规则表示就是\d{4},就是编号里的四位数字编码
现在我就想根据这4位的数字编码来进行分组合计查询,应该怎么做呢??
限制
1、由于项目比较老了,用的还是sqlserver2000的数据库
2、数据源大概有40000条,通过筛选出来类似上面提到的编号和数量的2个字段表平均有5000条
上面编号的例子,第三个有问题,不可能出现第3个编号
所有编号中,要么有且只有一个4位数字编号,要么没有数字编号 展开
aaa4587fd
4344ddd5
d2543565
用正则表达式的规则表示就是\d{4},就是编号里的四位数字编码
现在我就想根据这4位的数字编码来进行分组合计查询,应该怎么做呢??
限制
1、由于项目比较老了,用的还是sqlserver2000的数据库
2、数据源大概有40000条,通过筛选出来类似上面提到的编号和数量的2个字段表平均有5000条
上面编号的例子,第三个有问题,不可能出现第3个编号
所有编号中,要么有且只有一个4位数字编号,要么没有数字编号 展开
展开全部
使用vbscript 或者是frameword程序集向SqlServer数据库中添加一个正则表达式函数,就可以满足你的需求了嘛。
vbscript 函数(需要SqlServer运行环境中vbscript 库)
CREATE function [dbo].[RegexMatchFirst]
(
@source ntext, --原字符串
@regexp varchar(1000), --正则表达式
@global bit = 1, --是否是全局替换
@ignoreCase bit = 0 --是否忽略大小写
)
returnS varchar(1000) AS
begin
declare @hr integer
declare @objRegExp integer
declare @objMatch INT
declare @matchcount INT
declare @command varchar(50)
declare @result varchar(5000)
exec @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Global', @global
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OAMethod @objRegExp, 'execute', @objmatch OUTPUT, @source
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
EXEC @hr= sp_OAGetProperty @objmatch, 'count', @matchcount OUT
IF @hr <> 0 or @objmatch = 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
set @command = 'item(0).Value'
EXEC @hr= sp_OAGetProperty @objmatch, @command, @result OUT
exec @hr = sp_OADestroy @objRegExp
IF @hr <> 0 begin
return null
end
return @result
end
framework运行时程序集:
打开 Microsoft Visual Studio,创建一个sqlserver 数据库数据库项目,在项目中按照SqlServer方式创建一个正则表达式匹配函数,然后编译部署到你的SqlServer数据库中。
这个时候刷新数据库的可编程性-->函数 --> 标量值函数就会看到你在Microsoft Visual Studio中创建的自定义函数了。
vbscript 函数(需要SqlServer运行环境中vbscript 库)
CREATE function [dbo].[RegexMatchFirst]
(
@source ntext, --原字符串
@regexp varchar(1000), --正则表达式
@global bit = 1, --是否是全局替换
@ignoreCase bit = 0 --是否忽略大小写
)
returnS varchar(1000) AS
begin
declare @hr integer
declare @objRegExp integer
declare @objMatch INT
declare @matchcount INT
declare @command varchar(50)
declare @result varchar(5000)
exec @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Global', @global
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OAMethod @objRegExp, 'execute', @objmatch OUTPUT, @source
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
EXEC @hr= sp_OAGetProperty @objmatch, 'count', @matchcount OUT
IF @hr <> 0 or @objmatch = 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
set @command = 'item(0).Value'
EXEC @hr= sp_OAGetProperty @objmatch, @command, @result OUT
exec @hr = sp_OADestroy @objRegExp
IF @hr <> 0 begin
return null
end
return @result
end
framework运行时程序集:
打开 Microsoft Visual Studio,创建一个sqlserver 数据库数据库项目,在项目中按照SqlServer方式创建一个正则表达式匹配函数,然后编译部署到你的SqlServer数据库中。
这个时候刷新数据库的可编程性-->函数 --> 标量值函数就会看到你在Microsoft Visual Studio中创建的自定义函数了。
展开全部
是否匹配:
select dbo.RegexMatch('/Book/103.aspx','/book/(\d+).aspx',1)
返回1,表示匹配成功
select dbo.RegexMatch('/Book/103.aspx','/book/(\d+).aspx',0)
表示0,匹配失败(不忽略大小写)。
数据提取:
select dbo.GetRegexMatchGroups('/Book/103.aspx','/book/(\d+).aspx',1,50)
返回103,非常方便的提取。
select dbo.RegexMatch('/Book/103.aspx','/book/(\d+).aspx',1)
返回1,表示匹配成功
select dbo.RegexMatch('/Book/103.aspx','/book/(\d+).aspx',0)
表示0,匹配失败(不忽略大小写)。
数据提取:
select dbo.GetRegexMatchGroups('/Book/103.aspx','/book/(\d+).aspx',1,50)
返回103,非常方便的提取。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
sqlserver2000 不支持正则表达式的。
只能自己编写函数,来进行数字的分析判断,比如:
f_has4digit('aaa4587fd')
返回0和1
然后放到查询中,并进行group by即可。
只能自己编写函数,来进行数字的分析判断,比如:
f_has4digit('aaa4587fd')
返回0和1
然后放到查询中,并进行group by即可。
更多追问追答
追问
你说的自定义函数是数据库的 还是服务器端脚本的啊?
你说2000不支持正则,那这个自定义函数通过什么方式提取四位编码呢?
追答
就是数据库的自定义函数,和存储过程类似。
对传入的字符串进行逐个字符分析,判断是否连续几个数字就是了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这么老的数据库,干嘛不用代码来处理这个逻辑。
追问
如果直接从数据库取出数据,然后用服务器端的语言,比如php进行循环正则
然后用循环进行分类汇总,经过2次全范围循环,这个过程会不会效率太低了
追答
那你就用临时表在数据库端处理,但是数据库段压力会很大,如果用代码在内存处理的话才4W条数据应该不会很慢的。你试试。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询