una separar por funciones extraer especificos delimitada datos contar comas charindex caracteres caracter cadena buscar sql sql-server oracle localization collation

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.



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''