在 SQL Server 中高效搜索前缀范围

Hei*_*nzi 4 performance sql-server query-performance

假设我想要在两个用户提供的相同长度的字母数字值之间带有前缀的所有记录。因此,如果用户输入A010and A025,我想返回A0101, A0200and A0259

我试过的:

  1. 显然,我不能使用WHERE myText BETWEEN @from and @to,因为那不会返回A0259

  2. 从技术上讲,WHERE LEFT(myText, @len) BETWEEN @from AND @to, 正是我想要的,但这会扼杀 SARGability

  3. 我可以使用WHERE myText BETWEEN @from and @to + 'zzzzzzzzzzz',但这是一个丑陋的黑客,并且可能容易出错。(z真的是最高字符吗?我是否使用了足够的“填充”字符?)

  4. 我可以“分解”范围并搜索每个可能的前缀,例如WHERE (myText LIKE 'A01%' OR myText LIKE 'A020%' OR myText LIKE 'A021%' ...),但这是很多工作。

是否有一些我错过的智能解决方案?我可能会使用选项 3 来解决问题(因为我知道允许字符的长度和范围),但我对一般情况很好奇。

Jam*_*son 7

如果您使用>=and<运算符,您可以通过“将第二个参数增加 1”来返回所需的范围。从技术上讲,将最后一个字符 ( '5')替换'6'为字符集中的下一个字符 ( )。

下面是一个查询,它返回A010和范围内的所有行A025。为了得到这个,我'A026'作为第二个参数传递。该表达式< 'A026'包括值'A0259456546'

DECLARE @Test TABLE
(
    Val NVARCHAR(100)
) ;

INSERT @Test
VALUES ('A0004534543'), 
       ('A01034950834'), 
       ('A020043553'), 
       ('A0259456546'), 
       ('A0264565464') ;

SELECT  *

FROM    @Test

WHERE   Val >= 'A010' 
        AND Val < 'A026' ;
Run Code Online (Sandbox Code Playgroud)