Domanda

Ho una tabella, utenti, in un database Oracle 9.2.0.6. Due dei campi sono varchar - last_name e first_name.

Quando le righe vengono inserite in questa tabella, i campi del nome e del cognome devono essere in maiuscolo, ma in qualche modo alcuni valori in questi due campi sono in maiuscolo.

Voglio eseguire una query che mi mostrerà tutte le righe della tabella che hanno il nome o il cognome con caratteri minuscoli.

Ho cercato in rete e trovato REGEXP_LIKE, ma questo deve essere per le versioni più recenti di Oracle - non sembra funzionare per me.

Un'altra cosa che ho provato è stato tradurre " abcde ... z " a " $$$$$ ... $ " e quindi cercare un '$' nel mio campo, ma ci deve essere un modo migliore?

Grazie in anticipo!

È stato utile?

Soluzione

Che ne dici di questo:

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

Altri suggerimenti

Penso che l'SQL di BQ e il secondo SQL di Justin funzioneranno, perché in questo scenario:

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

Voglio che la mia query restituisca le prime 2 righe.

Voglio solo assicurarmi che questa sarà una query efficiente - la mia tabella contiene 500 milioni di righe.

Quando dici upper (first_name)! = first_name, è " first_name " sempre pertinente alla riga corrente che l'oracolo sta guardando? Avevo paura di usare questo metodo all'inizio perché avevo paura di finire per unire questa tabella a se stessa, ma il modo in cui entrambi avete scritto l'SQL sembra che il controllo di uguaglianza funzioni solo su una riga per riga, che funzionerebbe per me.

Se stai cercando Oracle 10g o superiore, puoi usare l'esempio seguente. Considera che devi scoprire le righe in cui una qualsiasi delle lettere in una colonna è minuscola.

Column1
.......
MISS
miss
MiSS

Nell'esempio sopra, se è necessario trovare i valori miss e MiSS , è possibile utilizzare la query seguente

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 )

Prova questo:

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

per il server SQL in cui l'impostazione di confronto DB è senza distinzione tra maiuscole e minuscole, utilizzare quanto segue:

SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top