Je voudrais effectuer un select qui trouve toutes les lignes qui ont quelque chose comme $ Value (SomeNumber) $. La partie Value et SomeNumber est dynamic.
Comment puis-je créer un select pour correspondre à ces conditions?
J'essaye de cette façon:
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}\)$%'
MSSQL a un support embedded pauvre pour les expressions régulières, deux options sont
a) Création d'une routine stockée CLR, voir http://msdn.microsoft.com/fr-fr/magazine/cc163473.aspx
b) En utilisant VBScript.RegExp dans TSQL, voir http://blogs.msdn.com/b/khen1234/archive/2005/05/11/416392.aspx
Les deux ont besoin au less de MSSQL 2005.
Package CLR incluant les fonctions Regex CLR Sql #
LIKE sur TechNet
PATINDEX sur TechNet
Si vous voulez Regex et pouvez utiliser CLR, j'utiliserais Sql # .
Pas tout à fait sûr que les règles de votre search basées sur ce qui est disponible dans la question, mais cela pourrait conduire quelque part:
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 SsortingngMatch=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 valeur rowtxt ----------- ---------------- ----------------------- ------------------ 0 Badass (5) Ceci est SamSaffron $ Badass $ 1 Badass (5) Ceci est BrentO $ Badass (12) $ 1 Badass (5) Voici AaronBertrand $ Badass (20141222) $ 0 Badass (5) Ceci est SqlZim $ Non As Badass (N) $ 0 Badass (5) Ceci est SqlZim $ Badass (ButNoNumber) $ 1 Badass (5) Ceci est SqlZim $ Badass (1Numéro) $
@value = 'BadAss' returns
IsMatch valeur rowtxt ----------- ---------------- ----------------------- ------------------ 1 Badass C'est SamSaffron $ Badass $ 1 Badass Ceci est BrentO $ Badass (12) $ 1 Badass Voici AaronBertrand $ Badass (20141222) $ 0 Badass Ceci est SqlZim $ Non As Badass (N) $ 1 Badass Ceci est SqlZim $ Badass (ButNoNumber) $ 1 Badass Ceci est SqlZim $ Badass (1Numéro) $