在 Sql語句中使用正規表示式來查詢你所要的字元

iSQlServer發表於2009-04-15

這幾天有個專案需要從表的某個欄位判斷是否存在某些規則的字串,大概如下:

有個表叫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 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-589279/,如需轉載,請註明出處,否則將追究法律責任。

相關文章