sqlserver中正则表达式和分组查询
发布网友
发布时间:2022-04-29 01:23
我来回答
共4个回答
热心网友
时间:2022-04-08 07:00
使用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中创建的自定义函数了。
热心网友
时间:2022-04-08 08:18
是否匹配:
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,非常方便的提取。
热心网友
时间:2022-04-08 09:53
sqlserver2000 不支持正则表达式的。
只能自己编写函数,来进行数字的分析判断,比如:
f_has4digit('aaa4587fd')
返回0和1
然后放到查询中,并进行group by即可。
热心网友
时间:2022-04-08 11:44
这么老的数据库,干嘛不用代码来处理这个逻辑。追问如果直接从数据库取出数据,然后用服务器端的语言,比如php进行循环正则
然后用循环进行分类汇总,经过2次全范围循环,这个过程会不会效率太低了
追答那你就用临时表在数据库端处理,但是数据库段压力会很大,如果用代码在内存处理的话才4W条数据应该不会很慢的。你试试。