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!

¿Fue útil?

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))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top