论坛首页 综合技术论坛

在数据库中用正则表达式查询数据

浏览 2966 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-30   最后修改:2009-12-30
  • Mysql5.0及以后直接支持.

select * from customer where email regexp '@126.com';
详细信息参考
  • MS SQL2000及以后支持.

/* 本文来自Cory Koski。Cory写道:“我最近遇到一个问题,就是试图在数据库域中搜索一个正则表达式。还没有一个版本的SQLServer内部支持正则表达式,但我发现了一个将正则表达式的所有优点添加到你的T_SQL应用的方法。为了更容易的使用正则表达式,我们可以使用自定义函数(User Defined Function, UDF)来帮助我们并使工作简洁。”

在这个解决方案中,我们需要SQL Server 2000或更高。我们还需要确定机器中有VBScript.RegExp类库,这随大多数Windows 2000 servers中的Windows Scripting包配有。若你正在使用一个更早版本的Windows,你必须为你的操作系统下载最新版的Windows Scripting。
自定义函数
下面是我的自定义函数,可用来在源字符串中搜索一个正则模式表达式。*/
ALTER  FUNCTION dbo.find_regular_expression
 (
  @source varchar(5000),
  @regexp varchar(1000),
  @ignorecase bit = 0
 )
RETURNS bit
AS
 BEGIN
  DECLARE @hr integer
  DECLARE @objRegExp integer
  DECLARE @objMatches integer
  DECLARE @objMatch integer
  DECLARE @count integer
  DECLARE @results bit
  
  EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OASetProperty @objRegExp, 'Global', false
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END 
  EXEC @hr = sp_OAMethod @objRegExp, 'Test', @results OUTPUT, @source
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OADestroy @objRegExp
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
 RETURN @results
 END


ALTER  function dbo.regexReplace
(
@source varchar(5000),    --原字符串
@regexp varchar(1000),    --正則表換式
@replace varchar(1000),   --替換值
@globalReplace bit = 0,   --是否是全局替換
@ignoreCase bit = 0       --是否忽略大小寫
)
returnS varchar(1000) AS
begin
declare @hr integer
declare @objRegExp integer
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', @globalReplace
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, 'Replace', @result OUTPUT, @source, @replace
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OADestroy @objRegExp
IF @hr <> 0 begin
return null
end

return @result
end


i.e.
select top 1 * from hc_info_email where dbo.find_regular_expression(hc_rep_email,'@sohu|yahoo.com',0) != 0;
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics