比较字符串结尾的最佳方法是使用RIGHT,LIKE还是其他?

Djo*_*jof 10 sql t-sql sql-server optimization string-comparison

我需要将字符串的结尾与存储过程中可能结束的列表进行比较.这将被称为很多,并有大约10-15个候选人结局.此时,仅代码解决方案优于创建专用于此的表.有点像:

IF (ENDSWITH(@var, 'foo') OR
    ENDSWITH(@var, 'bar') OR
    ENDSWITH(@var, 'badger') OR
    ENDSWITH(@var, 'snake'))
(
)
Run Code Online (Sandbox Code Playgroud)

我正在寻找速度方面的最佳方式,同时也是可维护性.我知道的候选人是

  • 对,我最喜欢的,但这意味着我必须对字符串长度进行硬编码,因此容易出错.它还意味着多次切割源字符串.

    IF ((LEN(@var) >= 3 AND RIGHT(@var, 3) = 'foo')) OR ...
    
    Run Code Online (Sandbox Code Playgroud)
  • 喜欢,可能更慢,但有点清洁

    IF (@var LIKE '%foo') OR ...
    
    Run Code Online (Sandbox Code Playgroud)
  • CHARINDEX,因为它搜索整个字符串,所以可能更慢

  • SUBSTRING,很可能等同于RIGHT而且更难看

  • SQLCLR创建我自己的ENDSWITH,它可以很快

可能有更好的方法我不知道.你怎么看?

Joe*_*lli 15

为SQL优化此方法的最佳方法可能是将REVERSE字符串值存储在另一个已编制索引的列中,并使用LEFT或LIKE搜索其左侧.

  • 谢谢!我有一个where条件:`col1 like'%'+ col2`.该查询需要2分钟才能运行.我将它改为:`REVERSE(col1),如REVERSE(col2)+'%',它在10秒内运行! (2认同)