我想执行一个选择,找到每个有$ 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}\)$%'
答案 0 :(得分:2)
CLR包,包括正则表达式CLR函数Sql#
如果你想要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。