SQL Server - 选择使用like和某种正则表达式

时间:2014-12-22 16:52:59

标签: sql-server regex

我想执行一个选择,找到每个有$ Value(SomeNumber)$的行。 SomeNumber 部分是动态的。

如何构建符合此条件的选择?

我试着这样:

DECLARE @VALUE VARCHAR(255)
SET @VALUE = 'Badass(5)' -- it could Badass, Badass(XXX) or Badass(XX)
SELECT Txt FROM Employers where Txt LIKE '%$' + @VALUE + '$%' OR 
    TxT LIKE '%$' + @VALUE + '\(\d{2}\)$%'

2 个答案:

答案 0 :(得分:2)

如果你想要Regex并且可以使用CLR,我会使用Sql#

根据问题中的可用内容不太确定您的搜索规则,但这可能会导致某处:

  declare @value varchar(255) = 'Badass(5)' -- it could Badass, Badass(XXX) or Badass(XX)/

  declare @parenthesis int = isnull(nullif(charindex('(',@value),0),256)
  declare @search_str varchar(255) = '%$'+left(@value,@parenthesis-1)
  declare @somenumber varchar(255) = case @parenthesis when 256 then '%$%' else '([0-9]%)$%' end
  declare @search varchar(255) = @search_str + @somenumber

  --select value=@value, search_str=@search_str, somenumber=@somenumber, search=@search

select StringMatch=case when rowtxt like @search then 1 else 0 end
  , value=@value
  , rowtxt
from (select rowtxt='This is SamSaffron $Badass$'
  union all select 'This is BrentO $Badass(12)$'
  union all select 'This is AaronBertrand $Badass(20141222)$ '
  union all select 'This is SqlZim $Not As Badass(N)$ '
  union all select 'This is SqlZim $Badass(ButNoNumber)$ '
  union all select 'This is SqlZim $Badass(1Number)$ '
) i

@value = 'BadAss(5)' returns

IsMatch     value            rowtxt
----------- ---------------- -----------------------------------------
0           Badass(5)        This is SamSaffron $Badass$
1           Badass(5)        This is BrentO $Badass(12)$
1           Badass(5)        This is AaronBertrand $Badass(20141222)$ 
0           Badass(5)        This is SqlZim $Not As Badass(N)$ 
0           Badass(5)        This is SqlZim $Badass(ButNoNumber)$ 
1           Badass(5)        This is SqlZim $Badass(1Number)$ 

@value = 'BadAss' returns

IsMatch     value            rowtxt
----------- ---------------- -----------------------------------------
1           Badass           This is SamSaffron $Badass$
1           Badass           This is BrentO $Badass(12)$
1           Badass           This is AaronBertrand $Badass(20141222)$ 
0           Badass           This is SqlZim $Not As Badass(N)$ 
1           Badass           This is SqlZim $Badass(ButNoNumber)$ 
1           Badass           This is SqlZim $Badass(1Number)$ 

答案 1 :(得分:1)

MSSQL对正则表达式的内置支持很差,有两个选项

a)创建CLR存储例程,请参阅http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

b)在TSQL中使用VBScript.RegExp,请参阅http://blogs.msdn.com/b/khen1234/archive/2005/05/11/416392.aspx

两者都至少需要MSSQL 2005。