在Sql语句中使用正则表达式来查找你所要的字符

简介:

这几天有个项目需要从表的某个字段判断是否存在某些规则的字符串,大概如下:

有个表叫TaskDeploy(任务部署的),其中字段Participants以格式 用户名,用户名 具体如下:

 

复制代码
admin,小明,samlin
小明,samlin,test
samlin,test,小明
samlin,admin
samlin,test
samlin,test
复制代码

 

好了,现在我要查找有指派给 'samlin'用户的任务记录怎么办?


我首先想到的是正则表达式,但Sql提供的功能真是少啊就是一个 like 加几个通配符,显然是满足不了我的要求的

 

于是从网上搜集了一些资料,整理了一下。

下面这个是一个自定义函数,用户可以调用这个函数判断指定的字符串是否符合正则表达式的规则.

复制代码
CREATE   FUNCTION  dbo.find_regular_expression
 (
  
@source   varchar ( 5000 ),    -- 需要匹配的源字符串
   @regexp   varchar ( 1000 ),   -- 正则表达式
   @ignorecase   bit   =   0    -- 是否区分大小写,默认为false
 )
RETURNS   bit    -- 返回结果0-false,1-true
AS
 
BEGIN

 
-- 0(成功)或非零数字(失败),是由 OLE 自动化对象返回的 HRESULT 的整数值。
   DECLARE   @hr   integer  

-- 用于保存返回的对象令牌,以便之后对该对象进行操作
   DECLARE   @objRegExp   integer     DECLARE   @objMatches   integer

-- 保存结果
   DECLARE   @results   bit
  
/*
创建 OLE 对象实例,只有 sysadmin 固定服务器角色的成员才能执行 sp_OACreate,并确定机器中有VBScript.RegExp类库
*/
  
EXEC   @hr   =  sp_OACreate  ' VBScript.RegExp ' @objRegExp  OUTPUT
  
IF   @hr   <>   0   BEGIN
   
SET   @results   =   0
   
RETURN   @results
  
END
/*
以下三个分别是设置新建对象的三个属性。下面是'VBScript.RegExp'中常用的属性举例:
    Dim regEx,Match,Matches         '建立变量。
    Set regEx = New RegExp         '建立一般表达式。
    regEx.Pattern= patrn         '设置模式。
    regEx.IgnoreCase = True         '设置是否区分大小写。
    regEx.Global=True                             '设置全局可用性。
    set Matches=regEx.Execute(string)             '重复匹配集合
    RegExpTest = regEx.Execute(strng)      '执行搜索。
   for each match in matches                    '重复匹配集合
   RetStr=RetStr &"Match found at position "
   RetStr=RetStr&Match.FirstIndex&".Match Value is '"
   RetStr=RetStr&Match.Value&"'."&vbCRLF Next
   RegExpTest=RetStr

*/
  
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
-- 释放已创建的 OLE 对象
   EXEC   @hr   =  sp_OADestroy  @objRegExp
  
IF   @hr   <>   0   BEGIN
   
SET   @results   =   0
   
RETURN   @results
  
END
 
RETURN   @results
 
END
复制代码

 


下面是一个简单的测试sql语句,可以直接在查询分析器中运行。

 

复制代码
DECLARE   @intLength   AS   INTEGER
DECLARE   @vchRegularExpression   AS   VARCHAR ( 50 )
DECLARE   @vchSourceString   as   VARCHAR ( 50 )
DECLARE   @vchSourceString2   as   VARCHAR ( 50 )
DECLARE   @bitHasNoSpecialCharacters   as   BIT

--  初始化变量
SET   @vchSourceString   =   ' Test one This is a test!! '
SET   @vchSourceString2   =   ' Test two This is a test '

--  我们的正则表达式应该类似于
--
 [a-zA-Z ]{}
--
 如: [a-zA-Z ]{10}  dot.gif  一个十字符的字符串

--  获得字符串长度
SET   @intLength   =   LEN ( @vchSourceString )

--  设置完整的正则表达式
SET   @vchRegularExpression   =   ' [a-zA-Z ]{ '   +   CAST ( @intLength   as   varchar +   ' } '

--  是否有任何特殊字符
SET   @bitHasNoSpecialCharacters   =  dbo.find_regular_expression( @vchSourceString @vchRegularExpression , 0 )

PRINT   @vchSourceString
IF   @bitHasNoSpecialCharacters   =   1   BEGIN
 
PRINT   ' No special characters. '
END   ELSE   BEGIN
 
PRINT   ' Special characters found. '
END

PRINT   ' ************** '

--  获得字符串长度
SET   @intLength   =   LEN ( @vchSourceString2 )

--  设置完整的正则表达式
SET   @vchRegularExpression   =   ' [a-zA-Z ]{ '   +   CAST ( @intLength   as   varchar +   ' } '

--  是否有任何特殊字符
SET   @bitHasNoSpecialCharacters   =  dbo.find_regular_expression( @vchSourceString2 @vchRegularExpression , 0 )

PRINT   @vchSourceString2
IF   @bitHasNoSpecialCharacters   =   1   BEGIN
 
PRINT   ' No special characters. '
END   ELSE   BEGIN
 
PRINT   ' Special characters found. '
END

GO

复制代码

 

最后得出的查询语句如下:

 

select  *  FROM  TaskDeploy   where    1 = 1    And  dbo.find_regular_expression(Participants, ' \bsamlin\b ' , 0 =   1  

查找出包含 samlin 用户名记录的任务

但用函数的可能效率不知怎么样,下次测试一下

不知大家有没更好的方法?

 

转载请注明出处[ http://samlin.cnblogs.com/] 
作者赞赏
 


刚做的招标网: 八爪鱼招标网 请大家多意见
分类:  DataBase
标签:  SqlRegExp

本文转自Sam Lin博客博客园博客,原文链接:http://www.cnblogs.com/samlin/archive/2009/04/07/Sql-RegExp.html,如需转载请自行联系原作者
目录
相关文章
|
10天前
|
SQL 数据库
小课堂 -- 绕过去除特殊字符的sql注入
小课堂 -- 绕过去除特殊字符的sql注入
10 0
|
2天前
|
Java
38、Java 中的正则表达式(单字符匹配和预定义字符)
38、Java 中的正则表达式(单字符匹配和预定义字符)
10 0
|
28天前
|
SQL
sql语句将数字格式修改为字符
sql语句将数字格式修改为字符
|
7月前
正则表达式中的字符详解
正则表达式中的字符详解
53 1
|
3月前
|
人工智能 JavaScript
js正则表达式new RegExp(表达式, “gi“)不区分大小写、忽略大小写匹配替换字符
js正则表达式new RegExp(表达式, “gi“)不区分大小写、忽略大小写匹配替换字符
|
3月前
|
SQL Java 数据库连接
动态sql和分页下(mybatis的分页及特殊字符)
动态sql和分页下(mybatis的分页及特殊字符)
30 0
|
4月前
|
SQL 前端开发 Java
Mybatis的动态SQL分页及特殊字符应用
Mybatis的动态SQL分页及特殊字符应用
20 0
|
4月前
|
Python
132 python高级 - 正则表达式(表示字符)
132 python高级 - 正则表达式(表示字符)
41 0
|
5月前
|
SQL Java 数据库连接
Mybatis的动态SQL分页及特殊字符的使用
Mybatis的动态SQL分页及特殊字符的使用
27 0
|
5月前
|
SQL XML Java
mybatis动态sql&choose&foreach&sql 及include & sql中的特殊字符&后台分页实现& 数据版本号处理并发问题
mybatis动态sql&choose&foreach&sql 及include & sql中的特殊字符&后台分页实现& 数据版本号处理并发问题