2009-05-16 19 views
30

Come scrivere una query in Oracle ignorando il caso delle stringhe confrontate? Ad esempio "angelo", "Angelo", "ANGEL", "angelo", "AngEl" sarebbero tutti uguali se confrontati.Come confrontare le stringhe in caso di ignoranza sql?

+0

selezionare RPAD (a.name, 10, '=') "Nombre del Cliente", RPAD (b.name, 12, '*') "Nombre del Consumidor" da s_customer a, b s_region in cui un .region_id = b.id AND a.name LIKE '% sport%' Lo sport è la parola che ho bisogno di –

risposta

45

Se si sta corrispondendo l'intero valore del campo utilizzare

WHERE UPPER(fieldName) = 'ANGEL' 

EDIT: Dal tuo commento si desidera utilizzare:

SELECT 
    RPAD(a.name, 10,'=') "Nombre del Cliente" 
    , RPAD(b.name, 12,'*') "Nombre del Consumidor" 
FROM 
    s_customer a, 
    s_region b 
WHERE 
    a.region_id = b.id 
    AND UPPER(a.name) LIKE '%SPORT%' 
+2

vuoi da jaj, se la risposta di Gary ha risolto il tuo problema, dovresti accettare è come la risposta. :-) –

+10

Se la tabella del cliente è grande, varrebbe la pena considerare l'aggiunta di un indice basato sulla funzione in alto (nome) per questo tipo di query. –

9

È possibile utilizzare:

select * from your_table where upper(your_column) like '%ANGEL%' 

Altrimenti, è possibile utilizzare:

select * from your_table where upper(your_column) = 'ANGEL' 

Quale sarà più efficiente se si sta cercando una corrispondenza senza caratteri aggiuntivi prima o dopo il campo your_column come suggerito da Gary Ray nei suoi commenti.

+0

concordato. Like è più conciso. – Daniel

+0

@ PSC - La tua clausola where corrisponderà solo se una variazione di 'angel' senza caratteri aggiuntivi prima o dopo è nel campo. Se questo è il caso, allora '=' è più efficiente di 'LIKE'. Vedi il commento OP. –

12

è possibile utilizzare la parola chiave UPPER:

SELECT * 
FROM Customers 
WHERE UPPER(LastName) = UPPER('AnGel') 
0

Non ricordo la sintassi esatta, ma è possibile impostare la colonna della tabella di essere case insensitive. Ma fai attenzione perché non sarai più in grado di eguagliare il caso in base al caso e se vuoi che "cool" non corrisponda a "CoOl" non sarà più possibile.

+0

Non penso sia possibile impostare una colonna in maiuscolo tra le minuscole in Oracle. – tuinstoel

+0

Potrei sbagliarmi. So che è un'opzione in mySql –

2

Maggiori dettagli sulla risposta di Mr Dredel e sul commento di tuinstoel. I dati nella colonna verranno memorizzati nel caso specifico, ma è possibile modificare la sensibilità della maiuscole e della sessione per la corrispondenza.

È possibile modificare la sessione o il database per utilizzare la ricerca linguistica o senza distinzione tra maiuscole e minuscole. È anche possibile impostare indici per utilizzare determinati ordinamenti.

esempio

ALTER SESSION SET NLS_SORT=BINARY_CI; 

Una volta che si inizia a entrare in lingue diverse dall'inglese, con accenti e così via, non c'è supporto aggiuntivo per l'accento-insensitive. Alcune funzionalità variano a seconda della versione, quindi consulta il documento Globablization per la tua versione specifica di Oracle. L'ultima (11g) è here

3

prima di confrontare le due o più stringhe prima eseguire i seguenti comandi

alter session set NLS_COMP=LINGUISTIC; 
alter session set NLS_SORT=BINARY_CI; 

dopo quei due istruzioni eseguite allora si può confrontare le corde e ci sarà caso insensitive.for esempio avevi due stringhe s1 = 'Apple' e s2 = 'apple', se vuoi confrontare le due stringhe prima di eseguire le istruzioni precedenti allora quelle due stringhe saranno considerate come due stringhe diverse ma quando confronti le stringhe dopo l'esecuzione di le due istruzioni alter che poi quelle due stringhe s1 e s2 saranno trattate come la stessa stringa

ragioni per usare queste due affermazioni

Dobbiamo impostare NLS_COMP = linguistica e NLS_SORT = BINARY_CI al fine di utilizzare 10gR2 caso insensibilità. Poiché questi sono modificabili di sessione, non è così semplice come impostarli nei parametri di inizializzazione.Possiamo impostarli nei parametri di inizializzazione, ma influenzano solo il server e non il lato client.

Problemi correlati