假设我希望所有记录的前缀都介于两个用户提供的长度相同的字母数字值之间。因此,如果用户输入A010
and A025
,我想返回A0101
, A0200
and A0259
。
我试过的:
显然,我不能使用
WHERE myText BETWEEN @from and @to
,因为那不会返回A0259
。从技术上讲,
WHERE LEFT(myText, @len) BETWEEN @from AND @to
将正是我想要的,但这会扼杀 SARGability。我可以使用
WHERE myText BETWEEN @from and @to + 'zzzzzzzzzzz'
,但这是一个丑陋的 hack 并且可能容易出错。(z
真的是最高字符吗?我是否使用了足够的“填充”字符?)我可以“展开”范围并搜索每个可能的前缀,例如
WHERE (myText LIKE 'A01%' OR myText LIKE 'A020%' OR myText LIKE 'A021%' ...)
,但这需要大量工作。
我错过了一些聪明的解决方案吗?我可能会使用选项 3 来解决问题(因为我知道允许字符的长度和范围),但我对一般情况很好奇。
如果使用
>=
and<
运算符,您可以通过“将第二个参数增加”1 来返回所需的范围。从技术上讲,用字符集中'5'
的下一个字符 ('6'
) 替换最后一个字符 ( )。下面是一个返回
A010
和范围内所有行的查询A025
。'A026'
为了得到这个,我作为第二个参数传递。表达式< 'A026'
包含值'A0259456546'
。