Oracle: seleccione dónde el campo tiene caracteres en minúscula
-
11-07-2019 - |
Pregunta
Tengo una tabla, usuarios, en una base de datos Oracle 9.2.0.6. Dos de los campos son varchar: apellido y nombre.
Cuando se insertan filas en esta tabla, se supone que los campos de nombre y apellido están en mayúsculas, pero de alguna manera algunos valores en estos dos campos son mayúsculas y minúsculas.
Quiero ejecutar una consulta que me muestre todas las filas de la tabla que tengan nombres o apellidos con caracteres en minúscula.
Busqué en la red y encontré REGEXP_LIKE, pero eso debe ser para las versiones más nuevas de Oracle; no parece funcionar para mí.
Otra cosa que intenté fue traducir "abcde ... z" a '' $$$$$ ... $ '' y luego busco un '$' en mi campo, pero ¿tiene que haber una mejor manera?
¡Gracias de antemano!
Solución
¿Qué tal esto?
select id, first, last from mytable
where first != upper(first) or last != upper(last);
Otros consejos
Creo que el SQL de BQ y el segundo SQL de Justin funcionarán, porque en este escenario:
first_name last_name
---------- ---------
bob johnson
Bob Johnson
BOB JOHNSON
Quiero que mi consulta devuelva las primeras 2 filas.
Solo quiero asegurarme de que esta sea una consulta eficiente, mi tabla tiene 500 millones de filas.
Cuando dices upper (first_name)! = first_name, es " first_name " siempre perteneciente a la fila actual que está mirando Oracle? Al principio tenía miedo de usar este método porque temía terminar uniendo esta tabla a sí mismo, pero de la forma en que ambos escribieron el SQL, parece que la verificación de igualdad solo funciona fila por fila, lo que funcionaría para mí.
Si está buscando Oracle 10g o superior, puede usar el siguiente ejemplo. Tenga en cuenta que necesita encontrar las filas donde cualquiera de las letras de una columna está en minúsculas.
Column1
.......
MISS
miss
MiSS
En el ejemplo anterior, si necesita encontrar los valores miss
y MiSS
, puede usar la consulta a continuación
SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]');
SELECT *
FROM mytable
WHERE FIRST_NAME IN (SELECT FIRST_NAME
FROM MY_TABLE
MINUS
SELECT UPPER(FIRST_NAME)
FROM MY_TABLE )
Prueba esto:
SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]','c'); => Miss, miss lower text
SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[A-Z]','c'); => Miss, MISS upper text
para el servidor SQL donde la configuración de intercalación de DB no distingue entre mayúsculas y minúsculas, utilice lo siguiente:
SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1))