2013-06-03 6 views
11

Вопрос только о том, что вопросы будут иметь нулевые значения в запросе.Oracle/PL SQL/SQL null для сравнения where where

Например, у меня есть следующая таблица со следующими полями и значения

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

Я пропускание по переменной у конкретной процедуры. Внутри процедуры находится курсор, как этот

CURSOR c_results IS 
SELECT * FROM TABLEX where column2 = variableY 

теперь проблема переменная у может быть либо нулевыми, A, B или C , если переменный у равна нуля, я хочу, чтобы выбрать все записи, где column2 имеет нулевое значение, еще где column2 либо A, B или C.

Я не могу сделать выше курсора/запрос, потому что, если переменной у равна нулю, что не будет работать, потому что сравнение должно быть

CURSOR c_results IS 
SELECT * FROM TABLEX where column2 IS NULL 

что курсора/запрос я должен использовать это будет содержать либо нулевую, либо строковую переменную.

Извините, если мой вопрос немного запутан. Я не так хорошо объясняю вещи. Заранее спасибо.

ответ

17

Либо производить различные SQL в зависимости от содержания этого параметра, или изменить ваш SQL как это:

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

избили меня на секунду :) – Randy

+0

спасибо большое Лассе! отлично работал! спасибо всем, кто помог. :) – user2447740

0

Попробуйте использовать функцию ISNULL(). вы можете проверить, является ли переменная нулевой, и если да, установите возвращаемое значение по умолчанию. camparing null to null на самом деле невозможно. помните: нулевой <> нулевой

2

Вы могли бы использовать что-то вроде:

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

(COALESCE принимает первое не значение NULL)

Примечание это будет работать только тогда, когда содержание столбца не может быть '' (пустая строка). Иначе это утверждение завершится неудачно, потому что NULL будет соответствовать '' (пустая строка).

(редактировать) Вы также могли бы рассмотреть:

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

Это исправить '' провал гипотезы.

+0

В Oracle NULL <=> NULL. Итак, ваш первый пример просто неправильный. ** [Демонстрация] (http://rextester.com/QBUN21261) ** – lad2025

0

Может быть не соответствующим в зависимости от данных, которые вы просматриваете, но один трюк, который я видел (и использовал), - это сравнение NVL (fieldname, somenonexistentvalue).

Например, если AGE является дополнительным колонком, вы можете использовать:

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

Это зависит от наличия значения, которое вы знаете никогда не будут разрешены. Возраст - хороший пример, зарплата, порядковые номера и другие цифры, которые не могут быть отрицательными. Конечно, струны могут быть более сложными - вы можете сказать, что ни у кого не будет никого по имени «xyzzymaryhadalittlelamb» или что-то в этом роде, но в тот день, когда вы начнете с этого предположения, вы ЗНАЕТЕ, что они наняли кого-то с этим именем!

Все, что говорило: «где a = b или (a равно null и b равно null)» - это традиционный способ его решения.К сожалению, даже опытные программисты иногда забывают эту часть.

0

Ниже похож на "верх" ответ, но более кратким:

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

+0

Увидите дату перед отправкой приятеля. Также ответ уже передан. –

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

Пожалуйста, отредактируйте ответ и добавьте объяснение, почему это должно работать. – Tushar

0

Вы можете использовать DUMP:

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

DBFiddle Demo

Внимание: Это не Sarg-возможности выражения, так что не будет использования индекса.

При таком подходе вам не нужно искать значение, которое не существует в ваших данных (например, NVL/COALESCE).

Смежные вопросы