Pergunta

Eu preciso adicionar a capacidade dos usuários de meu software para selecionar registros por cadeias de caracteres.
Como posso escrever uma consulta que retorna todos os widgets de uma tabela cujo nome cai no intervalo Ba-Bi por exemplo?

Atualmente estou usando maior e menor do que os operadores, para que o exemplo acima seria:

select * from widget
where name >= 'ba' and name < 'bj'

Observe como eu "incrementado" o último caractere do limite superior de i para j para que "bike" não iria ficar de fora.

Existe uma maneira genérica para encontrar o próximo caractere após um determinado personagem baseado em agrupamento do campo ou seria mais seguro para criar uma segunda condição?

select * from widget
where name >= 'ba'
and (name < 'bi' or name like 'bi%')

Meu aplicativo precisa localização de apoio. Quão sensível é este tipo de consulta a diferentes conjuntos de caracteres?

Eu também preciso apoiar tanto MSSQL e Oracle. Quais são as minhas opções para garantir que caixa caráter é ignorado não importa o que aparece língua nos dados?

Foi útil?

Solução

Vamos pular diretamente para a localização. Você diria "aa"> = "ba"? Provavelmente não, mas é aí que ele classifica na Suécia. Além disso, você simplesmente não pode assumir que você pode ignorar invólucro em qualquer idioma. Carcaça é explicitamente dependente de idioma, com o exemplo mais comum sendo turco: maiúscula i é i. Minúscula i é i.

Agora, o SQL DB define o resultado de <, == etc por uma "ordem de agrupamento". Este é definitivamente linguagem específica. Assim, você deve explicitamente controlar isso, para cada consulta. Uma ordem de agrupamento turco vai colocar aqueles i é onde pertencem (em turco). Você não pode contar com o agrupamento padrão.

Quanto à "parte incremento", não se incomode. Vara a> = e <=.

Outras dicas

Para MSSQL ver este tópico: http://bytes.com/forum/thread483570.html.

Para Oracle, que depende de sua versão Oracle, como Oracle 10 agora suporta regex (p) como consultas: http://www.psoug.org/reference/regexp.html (procurar regexp_like) e veja este artigo: http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html

HTH

Frustrantemente, a função substring Oracle é SUBSTR (), enquanto que o SQL Server-lo de SUBSTRING ().

Você poderia escrever um wrapper simples em torno de um ou de ambos para que eles compartilham o mesmo nome de função + protótipo.

Em seguida, você pode simplesmente usar

MY_SUBSTRING(name, 2) >= 'ba' AND MY_SUBSTRING(name, 2) <= 'bi'

ou similar.

Você pode usar isso ...

select * from widget
where name Like 'b[a-i]%'

Isso irá corresponder a qualquer linha onde o nome começa com b, o segundo personagem está na faixa de A a I, e quaisquer outros personagens seguir.

Eu acho que eu iria com algo simples como anexar uma seqüência de classificação alta para o fim do limite superior. Algo como:

select * from widgetwhere name >= 'ba' and name <= 'bi'||'~'

Eu não tenho certeza de que iria sobreviver conversão EBCDIC embora

Você também pode fazê-lo como este:

select * from widget
where left(name, 2) between 'ba' and 'bi'

Se as alterações de comprimento critérios (como você parecia indicar em um comentário que deixou), a consulta seria necessário ter o comprimento como uma entrada também:

declare @CriteriaLength int
set @CriteriaLength = 4
select * from widget
where left(name, @CriteriaLength) between 'baaa' and 'bike'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top