SQL Server – Sélectionnez en utilisant like et une sorte de regex

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

  • PATINDEX Workbench – Phil Factor

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) $