在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}    一个十字符的字符串

--  获得字符串长度
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,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
SQL 数据采集 存储
SQL server 特殊字符"\u0000"处理
【9月更文挑战第12天】在 SQL Server 中,空字符 `\u0000` 可能导致数据处理问题。解决方法包括:1) 查找包含该字符的数据,使用 `LIKE &#39;%\u0000%&#39;` 进行查询;2) 替换该字符,使用 `REPLACE` 函数将其替换为空或其他字符;3) 在应用程序中验证和清理输入数据,防止其插入数据库;4) 注意数据类型、索引性能及数据库设计,确保数据质量和可靠性。
115 0
|
3月前
正则表达式的限定符、或运算符、字符类、元字符、贪婪/懒惰匹配
本文介绍了正则表达式中的限定符、或运算符、字符类、元字符以及贪婪与懒惰匹配的概念和用法。
38 5
|
3月前
|
Python
【Python】正则表达式判断是否存在连续相同的两个字符,连续两个字符一模一样
Python函数isContinuousChar,使用正则表达式来检测字符串中是否存在连续的相同字母或数字,并返回存在此类字符的列表长度,如果列表长度为0则表示不存在连续相同的字符。
144 2
|
3月前
|
SQL 关系型数据库 数据处理
|
3月前
|
SQL 数据处理 数据库
SQL正则表达式应用:文本数据处理的强大工具——深入探讨数据验证、模式搜索、字符替换等核心功能及性能优化和兼容性问题
【8月更文挑战第31天】SQL正则表达式是数据库管理和应用开发中处理文本数据的强大工具,支持数据验证、模式搜索和字符替换等功能。本文通过问答形式介绍了其基本概念、使用方法及注意事项,帮助读者掌握这一重要技能,提升文本数据处理效率。尽管功能强大,但在不同数据库系统中可能存在兼容性问题,需谨慎使用以优化性能。
47 0
|
5月前
|
人工智能 Java 数据格式
JavaSE——正则表达式(1/2):概述、初步使用(普通方法,正则表达式)、书写规则(字符类,预定义字符,数量词,其他,特殊案例)
JavaSE——正则表达式(1/2):概述、初步使用(普通方法,正则表达式)、书写规则(字符类,预定义字符,数量词,其他,特殊案例)
45 3
|
6月前
|
Java
Java正则表达式去掉非汉字字符
【5月更文挑战第11天】Java正则表达式去掉非汉字字符
122 3
|
5月前
|
SQL Oracle 关系型数据库
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
71 0
|
6月前
|
监控 JavaScript 前端开发
|
6月前
|
SQL Java 数据库连接
解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
128 0