sql - separar - ¿Cuál es la mejor manera de seleccionar campos de cadenas en función de los rangos de caracteres?
separar cadena delimitada por comas en sql server (6)
Creo que iría con algo simple como agregar una cadena de alta clasificación al final del límite superior. Algo como:
select * from widgetwhere name >= ''ba'' and name <= ''bi''||''~''
No estoy seguro de que pueda sobrevivir la conversión EBCDIC, aunque
Necesito agregar la capacidad de los usuarios de mi software para seleccionar registros por rangos de caracteres.
¿Cómo puedo escribir una consulta que devuelve todos los widgets de una tabla cuyo nombre cae en el rango Ba-Bi, por ejemplo?
Actualmente estoy usando operadores mayores que 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 he "incrementado" el último carácter del límite superior de i a j para que no quede "bicicleta".
¿Hay una manera genérica de encontrar el siguiente carácter después de un personaje dado basado en la intercalació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 necesita ser compatible con la localización. ¿Qué tan sensible es este tipo de consulta a diferentes conjuntos de caracteres?
También necesito admitir tanto MSSQL como Oracle. ¿Cuáles son mis opciones para garantizar que se ignore la envoltura de caracteres sin importar el idioma que aparezca en los datos?
Frustrante, la función de subcadena de Oracle es SUBSTR (), mientras que SQL-Server es SUBSTRING ().
Podría escribir un envoltorio simple alrededor de uno o ambos para que compartan el mismo nombre de función + prototipo.
Entonces solo puedes usar
MY_SUBSTRING(name, 2) >= ''ba'' AND MY_SUBSTRING(name, 2) <= ''bi''
o similar.
Para MSSQL, vea este hilo: http://bytes.com/forum/thread483570.html .
Para Oracle, depende de su versión de Oracle, ya que Oracle 10 ahora es compatible con las consultas de tipo regex (p): http://www.psoug.org/reference/regexp.html (busque por regexp_like) y vea este artículo: http: / /www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html
HTH
Pasemos directamente a la localización. ¿Dirías "aa"> = "ba"? Probablemente no, pero eso es lo que hace en Suecia. Además, simplemente no puede suponer que puede ignorar la carcasa en cualquier idioma. Casing es explícitamente dependiente del idioma, siendo el ejemplo más común el turco: mayúscula i is İ. La minúscula I es ı.
Ahora, su base de datos SQL define el resultado de <, == etc por un "orden de clasificación". Esto es definitivamente específico del idioma. Por lo tanto, debe controlar esto explícitamente, para cada consulta. Una orden de colación turca pondrá esos i''s a donde pertenecen (en turco). No puede confiar en la intercalación predeterminada.
En cuanto a la "parte de incremento", no te molestes. Quédate con> = y <=.
Podrías usar esto ...
select * from widget
where name Like ''b[a-i]%''
Esto coincidirá con cualquier fila donde el nombre empiece por b, el segundo carácter esté en el rango de aa i, y cualquier otro personaje siga.
También podrías 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''