Search code examples
sqlsql-serverregexsql-like

More efficient/elegant way of handling this complicated LIKE statement?


I need some help trying make this LIKE statement a little more elegant and efficient. It performs how I'd expect it to, but it's very slow, even on small data sets. I am using SQL-Server 2016 with SSMS 2017 on a win 10 machine. Thanks in advance!

where (a.Description like '% ' + @event + ' %'  
        or a.Description like '% ' + @event + '.'   
        or a.Description like '% ' + @event + '.%'  
        or a.Description like '% ' + @event + ',%'  
        or a.Description like '% ' + @event + ';%'
        or a.Description like '%'  + @event + '/%'
        or a.Description like '%/' + @event + '%'
        or a.Description like '% ' + @event 
        or a.Description like @event + ' %' 
        or a.Description like @event 
        )

@event is just a varchar like 'Death' or 'Tripped'. If you have a better approach, by all means, school me!


Solution

  • T-SQL supports character classes in LIKE so you can simplify:

    where (a.Description like '%[ /]' + @event + '[ .,;/]%'
            or a.Description like '%[ /]' + @event
            or a.Description like @event + '[ .,;/]%'
            or a.Description like @event 
            )
    

    If you are willing to accept any non-alphabetical separators (what about digits) you can do something like:

    where (a.Description like '%[^a-z0-9]'+@event+'[^a-z0-9]%'
           or a.Description like @event+'[^a-z0-9]%'
           or a.Description like '%[^a-z0-9]'+@event
           or a.Description like @event
           )