Pregunta

Necesito agregar la capacidad para que los usuarios de mi software seleccionen registros por rangos de caracteres.
¿Cómo puedo escribir una consulta que devuelva todos los widgets de una tabla cuyo nombre se encuentra en el rango Ba-Bi, por ejemplo?

Actualmente estoy usando operadores mayores y menores que, por lo que el ejemplo anterior se convertiría en:

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

Observe cómo tengo " incrementé " el último carácter del límite superior de i a j para que " bike " no se quedaría fuera.

¿Existe una forma genérica de encontrar el siguiente carácter después de un carácter determinado en función de la clasificación del campo o sería más seguro crear una segunda condición?

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

Mi aplicación debe ser compatible con la localización. ¿Qué tan sensible es este tipo de consulta a diferentes conjuntos de caracteres?

También necesito admitir MSSQL y Oracle. ¿Cuáles son mis opciones para garantizar que se ignore la mayúscula de los caracteres sin importar el idioma que aparezca en los datos?

¿Fue útil?

Solución

Pasemos directamente a la localización. ¿Dirías & Quot; aa & Quot; > = " ba " ? Probablemente no, pero ahí es donde suena en Suecia. Además, simplemente no puede suponer que puede ignorar la carcasa en cualquier idioma. La carcasa depende explícitamente del idioma, siendo el ejemplo más común el turco: mayúscula i es & # 304 ;. I minúscula es & # 305 ;.

Ahora, su base de datos SQL define el resultado de < ;, == etc por un " orden de clasificación " ;. Esto definitivamente es específico del idioma. Por lo tanto, debe controlar explícitamente esto, para cada consulta. Una orden de clasificación turca colocará esas i's donde pertenecen (en turco). No puede confiar en la clasificación predeterminada.

En cuanto a & "; incremente la parte &"; no se moleste. Apéguese a & Gt; = y & Lt; =.

Otros consejos

Para MSSQL ver este hilo: http://bytes.com/forum/thread483570.html.

Para Oracle, depende de su versión de Oracle, ya que Oracle 10 ahora admite consultas como expresiones regulares (p): http://www.psoug.org/reference/regexp.html (busque regexp_like) y vea este artículo: http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html

HTH

Frustrantemente, la función de subcadena de Oracle es SUBSTR (), mientras que SQL-Server es SUBSTRING ().

Podría escribir un contenedor simple alrededor de uno o ambos para que compartan el mismo nombre de función + prototipo.

Entonces puedes usar

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

o similar.

Podrías usar esto ...

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

Esto coincidirá con cualquier fila donde el nombre comience con b, el segundo carácter está en el rango de a a i, y cualquier otro carácter sigue.

Creo que iría con algo simple como agregar una cadena de clasificación alta al final del límite superior. Algo así como:

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

Sin embargo, no estoy seguro de que pueda sobrevivir a la conversión EBCDIC

También puedes hacerlo así:

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

Si la longitud de su criterio cambia (como parecía indicar en un comentario que dejó), la consulta también debería tener la longitud como entrada:

declare @CriteriaLength int
set @CriteriaLength = 4
select * from widget
where left(name, @CriteriaLength) between 'baaa' and 'bike'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top