2013-06-03 14 views
11

Pytanie dotyczące transakcji będzie miało wartości puste w zapytaniu.Porównanie wartości zerowej Oracle/PL SQL/SQL w przypadku klauzuli

Na przykład mam następującą tabelę z następujących pól i wartości

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

Jestem przechodzącą variableY sprawie szczególnej procedury. Wewnątrz procedury jest kursor jak ten

CURSOR c_results IS 
SELECT * FROM TABLEX where column2 = variableY 

teraz problem jest variableY może być null, A, B lub C jeśli variableY jest null chcę zaznaczyć cały rekord gdzie column2 jest null, gdzie indziej column2 jest albo A, B lub C.

nie mogę zrobić powyższy kursora/zapytania, ponieważ jeśli variableY jest null to nie będzie działać, ponieważ porównanie powinno być

CURSOR c_results IS 
SELECT * FROM TABLEX where column2 IS NULL 

Co kursora/kwerendy należy używać, że pomieści zmienną null lub łańcuchową.

Przepraszam, jeśli moje pytanie jest nieco mylące. Nie jestem tak dobry w wyjaśnianiu rzeczy. Z góry dziękuję.

Odpowiedz

17

Albo produkować inny SQL w zależności od zawartości tego parametru, lub zmienić swój SQL tak:

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

bić mnie po drugim :) – Randy

+0

dzięki dużo Lasse! działało idealnie! dzięki wszystkim, którzy pomogli. :) – user2447740

0

Spróbuj użyć funkcji ISNULL(). możesz sprawdzić, czy zmienna ma wartość null, a jeśli tak, ustaw domyślną wartość zwracaną. camping null to null nie jest naprawdę możliwe. pamiętaj: null <> zerowy

2

Można użyć coś takiego:

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

(COALESCE zajmuje pierwsze non wartość NULL)

Uwaga ta będzie działać tylko wtedy, gdy zawartość kolumny nie może być '' (pusta struna). W przeciwnym wypadku to polecenie zakończy się niepowodzeniem, ponieważ NULL dopasuje '' (pusty ciąg).

(edit) Można rozważyć także:

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

Będzie to naprawić '' nie hipotezy.

+0

W Oracle NULL <=> NULL. Twój pierwszy przykład jest po prostu błędny. ** [Demo] (http://rextester.com/QBUN21261) ** – lad2025

0

Może nie być odpowiedni w zależności od danych, których szukasz, ale jedną sztuczką, którą widziałem (i użytym) jest porównanie NVL (nazwa pola, somenonexistentvalue).

Na przykład, jeśli wiek jest opcjonalna kolumna, można użyć:

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

ta opiera się na nie jest wartością, która wiesz nigdy nie będzie dozwolone. Wiek jest dobrym przykładem, wynagrodzenie, numery sekwencji i inne numery, które nie mogą być negatywne. Struny mogą być oczywiście trudniejsze - możesz powiedzieć, że nigdy nie będziesz mieć nikogo o nazwie "xyzzymaryhadalittlelamb" lub coś w tym rodzaju, ale w dniu, w którym używasz tego założenia WIEM, że zatrudnią kogoś o tym imieniu !!

Wszystko, co powiedzieliśmy: "gdzie a = b lub (a ma wartość null i b jest zerowa)" jest tradycyjnym sposobem rozwiązania tego problemu.Co jest niefortunne, ponieważ nawet doświadczeni programiści czasami to zapominają.

0

Poniżej jest podobna do "top" odpowiedź, ale bardziej zwięzły:

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

+0

widzę datę przed wysłaniem buddy..Also odpowiedź jest już dodanych. –

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

Proszę [edytuj] odpowiedź i dodaj wyjaśnienie, dlaczego to powinno działać. – Tushar

0

Można użyć DUMP:

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

DBFiddle Demo

Ostrzeżenie: To nie jest Sarg-stanie wyraz tak nie będzie użycie indeksu.

Przy takim podejściu nie trzeba szukać wartości, które nie istnieje w danych (jak NVL/COALESCE).