Digamos que eu queira todos os registros com um prefixo entre dois valores alfanuméricos fornecidos pelo usuário com o mesmo comprimento. Assim, se o usuário digitar A010
e A025
, quero retornar A0101
, A0200
e A0259
.
O que eu tentei:
Obviamente, não posso usar
WHERE myText BETWEEN @from and @to
, porque isso não retornaráA0259
.Tecnicamente,
WHERE LEFT(myText, @len) BETWEEN @from AND @to
seria exatamente o que eu quero, mas isso mata o SARGability .Eu poderia usar
WHERE myText BETWEEN @from and @to + 'zzzzzzzzzzz'
, mas esse é um hack feio e potencialmente sujeito a erros. (Éz
realmente o caractere mais alto? Usei caracteres de "preenchimento" suficientes?)Eu poderia "explodir" o intervalo e procurar todos os prefixos possíveis, por exemplo
WHERE (myText LIKE 'A01%' OR myText LIKE 'A020%' OR myText LIKE 'A021%' ...)
, mas isso dá muito trabalho.
Existe alguma solução inteligente que eu perdi? Provavelmente usarei a opção 3 para resolver o problema (já que sei sobre o comprimento e o intervalo de caracteres permitidos), mas estou curioso sobre o caso geral.
Se você usar os operadores
>=
e<
, poderá retornar o intervalo necessário "aumentando o segundo argumento" em 1. Tecnicamente, substituindo o último caractere ('5'
) pelo próximo caractere ('6'
) no conjunto de caracteres.Abaixo está uma consulta que retorna todas as linhas em seu intervalo de
A010
eA025
. Para obter isso, passo'A026'
como segundo argumento. A expressão< 'A026'
inclui o valor'A0259456546'
.