2008-11-25 13 views
14

Tengo una tabla, usuarios, en una base de datos Oracle 9.2.0.6. Dos de los campos son varchar - last_name y first_name.Oracle - Seleccione donde el campo tiene caracteres en minúsculas

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.

Deseo ejecutar una consulta que me muestre todas las filas de la tabla que tienen nombre o apellido con letras minúsculas.

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 probé fue traducir "abcde ... z" a "$$$$$ ... $" y luego buscar un '$' en mi campo, pero tiene que haber una manera mejor ?

¡Gracias de antemano!

Respuesta

49

¿Qué tal esto:

select id, first, last from mytable 
where first != upper(first) or last != upper(last); 
+0

impresionante ... . Estaba planeando un ciclo – Sayka

1

Creo SQL del BQ y el segundo SQL de Justin va a funcionar, porque en este escenario:

first_name  last_name 
----------  --------- 
bob    johnson 
Bob    Johnson 
BOB    JOHNSON 

Quiero que mi consulta para devolver las 2 primeras filas.

Solo quiero asegurarme de que esta sea una consulta eficiente: mi tabla tiene 500 millones de filas.

Cuando dice upper (first_name)! = First_name, ¿"first_name" siempre pertenece a la fila actual que Oracle está buscando? Al principio tenía miedo de usar este método porque temía terminar uniéndome a esta tabla, pero de la forma en que ambos escribieron el SQL, parece que la verificación de igualdad solo funciona fila por fila, lo cual me funcionaría

+2

La condición se aplica fila por fila. Por supuesto, su consulta tendrá que hacer un escaneo de tabla completo de una tabla de 500 millones de filas para procesar la consulta, que será lenta. Si esto es una ocurrencia regular, un índice basado en funciones podría ser útil. –

+0

Buen punto, Justin. También iba a agregar la sugerencia de índice basada en funciones. Además, si realmente se supone que los datos están en mayúsculas, puede crear un desencadenador para forzar esto en las inserciones. –

+1

Brian, no estoy seguro de lo que planeas hacer en su totalidad, pero ten en cuenta que también puedes ejecutar "update mytable set first_name = upper (first_name) and last_name = upper (last_name);" para normalizar todos sus datos ... no necesita buscarlos fila por fila y actualizarlos fuera de la base de datos. –

-1
SELECT * 
FROM mytable 
WHERE FIRST_NAME IN (SELECT FIRST_NAME 
         FROM MY_TABLE 
         MINUS 
         SELECT UPPER(FIRST_NAME) 
         FROM MY_TABLE) 
+0

Esto no encuentra 'last_name' con el caso incorrecto, y golpea la tabla tres veces. ¿Por qué sería mejor que la respuesta aceptada? –

-2

para el servidor SQL donde el valor de clasificación DB es insensible caso de uso lo siguiente:

SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1)) 
0

Si usted está buscando para Oracle 10g o superior puede utilizar el siguiente ejemplo. Considere que necesita encontrar las filas donde la letra de una columna es minúscula.

Column1 
....... 
MISS 
miss 
MiSS 

En el ejemplo anterior, si usted necesita para encontrar los valores miss y MiSS, a continuación, se puede utilizar la siguiente consulta

SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]'); 
-1

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 
+1

Considera expandir tu respuesta. Por favor explique cómo este código resuelve el problema. –

Cuestiones relacionadas