2013-06-03 20 views
11

Solo una domanda sulla negoziazione restituirà valori null in una query.Confronto null Oracle/PL SQL/SQL su where clausola

Per esempio io ho la seguente tabella con i seguenti campi e valori

TABLEX 
Column1 
1   
2   
3  
4   
5  
--------- 
Column2 
null 
A 
B 
C 
null 

sto passando un variableY su una procedura specifica. All'interno della procedura è un cursore simile

CURSOR c_results IS 
SELECT * FROM TABLEX where column2 = variableY 

ora il problema è variableY può essere sia nullo, A, B o C se il variableY è nullo voglio selezionare tutti record in cui column2 è nullo, altrove colonna2 è o A, B o C.

non posso fare quanto sopra cursore/query perché se variableY è nullo non funzionerà perché il confronto dovrebbe essere

CURSOR c_results IS 
SELECT * FROM TABLEX where column2 IS NULL 

Nei cursore/query dovrebbe utilizzare che accoglierà variabile nulla o stringa.

Scusa se la mia domanda è un po 'confusa. Non sono così bravo nello spiegare le cose. Grazie in anticipo.

risposta

17

In entrambi producono SQL diverso a seconda del contenuto di quel parametro, o modificare il vostro SQL come questo:

WHERE (column2 = variableY) OR (variableY IS NULL AND column2 IS NULL) 
+0

mi ha battuto di un secondo :) – Randy

+0

grazie mille Lasse! ha funzionato perfettamente! grazie a tutti coloro che hanno aiutato :) – user2447740

0

Provare a utilizzare la funzione ISNULL(). è possibile verificare se la variabile è nullo e, in tal caso, impostare un valore di ritorno predefinito. campare nullo a nulla non è realmente possibile. ricordate: null <> nullo

2

si potrebbe usare qualcosa di simile:

SELECT * FROM TABLEX WHERE COALESCE(column2, '') = COALESCE(variableY, '') 

(COALESCE prende il primo valore non NULL)

Nota questo funziona solo quando il contenuto colonna non può essere '' (stringa vuota). Altrimenti questa istruzione fallirà perché NULL corrisponderà a '' (stringa vuota).

(edit) Si potrebbe anche prendere in considerazione:

SELECT * FROM TABLEX WHERE COALESCE(column2, 'a string that never occurs') = COALESCE(variableY, 'a string that never occurs') 

Questo risolverà il '' fail ipotesi.

+0

In Oracle NULL <=> NULL. Quindi il tuo primo esempio è semplicemente sbagliato. ** [Demo] (http://rextester.com/QBUN21261) ** – lad2025

0

Potrebbe non essere appropriato in base ai dati che si stanno osservando, ma un trucco che ho visto (e utilizzato) è quello di confrontare NVL (fieldname, somenonexistentvalue).

Ad esempio, se l'età è una colonna facoltativa, è possibile utilizzare:

if nvl(table1.AGE,-1) = nvl(table2.AGE,-1) 

Questa si basa sulla presenza di un valore che si sa sarà mai permesso. L'età è un buon esempio, salario, numeri di sequenza e altri valori numerici che non possono essere negativi. Le stringhe possono essere più difficili ovviamente - potresti dire che non avrai mai nessuno chiamato "xyzzymaryhadalittlelamb" o qualcosa del genere, ma il giorno in cui corri con quell'assunzione tu SO che assumeranno qualcuno con quel nome !!

Tutto ciò che ha detto: "dove a = b o (a è nullo e b è nullo)" è il modo tradizionale per risolverlo.Il che è sfortunato, poiché anche i programmatori esperti ne dimenticano a volte una parte.

0

Qui di seguito è simile a "top" risposta, ma più conciso:

WHERE ((column2 = variableY) or COALESCE(column2, variableY) IS NULL)

+0

Vedere la data prima di pubblicare un amico. Anche la risposta è già condivisa. –

0
WHERE variableY is null or column2 = variableY 

for example: 
create table t_abc (
id number(19) not null, 
name varchar(20) 
); 

insert into t_abc(id, name) values (1, 'name'); 
insert into t_abc(id, name) values (2, null); 
commit; 

select * from t_abc where null is null or name = null; 
--get all records 

select * from t_abc where 'name' is null or name = 'name'; 
--get one record with name = 'name' 
+2

Si prega di [modificare] la risposta e aggiungere una spiegazione del perché questo dovrebbe funzionare. – Tushar

0

si potrebbe usare DUMP:

SELECT * 
FROM TABLEX 
WHERE DUMP(column2) = DUMP(variableY); 

DBFiddle Demo

Attenzione: questo non è SARG-in grado di espressione in modo non ci sarà l'utilizzo degli indici.

Con questo approccio non è necessario cercare il valore che non esiste nei dati (come NVL/COALESCE).