sqlserver中正则表达式和分组查询

我有这样的一张表,2个字段,一个字段是编号,一个字段是数量,编号类似下面的样子aaa4587fd4344ddd5d2543565用正则表达式的规则表示就是\d{4},就是... 我有这样的一张表,2个字段,一个字段是编号,一个字段是数量,编号类似下面的样子
aaa4587fd
4344ddd5
d2543565
用正则表达式的规则表示就是\d{4},就是编号里的四位数字编码
现在我就想根据这4位的数字编码来进行分组合计查询,应该怎么做呢??

限制
1、由于项目比较老了,用的还是sqlserver2000的数据库
2、数据源大概有40000条,通过筛选出来类似上面提到的编号和数量的2个字段表平均有5000条
上面编号的例子,第三个有问题,不可能出现第3个编号
所有编号中,要么有且只有一个4位数字编号,要么没有数字编号
展开
 我来答
二牛资讯
2014-11-06 · TA获得超过736个赞
知道小有建树答主
回答量:631
采纳率:50%
帮助的人:569万
展开全部
使用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中创建的自定义函数了。
Baby_原來
2016-01-12 · TA获得超过3402个赞
知道大有可为答主
回答量:1535
采纳率:94%
帮助的人:505万
展开全部
是否匹配:
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,非常方便的提取。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
micro0369
2014-11-06 · TA获得超过1.2万个赞
知道大有可为答主
回答量:9250
采纳率:85%
帮助的人:4068万
展开全部
sqlserver2000 不支持正则表达式的。

只能自己编写函数,来进行数字的分析判断,比如:

f_has4digit('aaa4587fd')
返回0和1

然后放到查询中,并进行group by即可。
更多追问追答
追问
你说的自定义函数是数据库的 还是服务器端脚本的啊?
你说2000不支持正则,那这个自定义函数通过什么方式提取四位编码呢?
追答
就是数据库的自定义函数,和存储过程类似。
对传入的字符串进行逐个字符分析,判断是否连续几个数字就是了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gy93108083
2014-11-06 · TA获得超过283个赞
知道小有建树答主
回答量:665
采纳率:50%
帮助的人:275万
展开全部
这么老的数据库,干嘛不用代码来处理这个逻辑。
追问
如果直接从数据库取出数据,然后用服务器端的语言,比如php进行循环正则

然后用循环进行分类汇总,经过2次全范围循环,这个过程会不会效率太低了
追答
那你就用临时表在数据库端处理,但是数据库段压力会很大,如果用代码在内存处理的话才4W条数据应该不会很慢的。你试试。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式