Oracle/PL SQL/SQL null для сравнения с предложением where

Просто вопрос о том, имеет дело, будет иметь нулевые значения в запросе.

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

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

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

CURSOR c_results IS
SELECT * FROM TABLEX where column2 = variableY

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

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

CURSOR c_results IS
SELECT * FROM TABLEX where column2 IS NULL

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

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

Ответ 1

Либо создайте другой SQL в зависимости от содержимого этого параметра, либо измените свой SQL следующим образом:

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

Ответ 3

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

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')

Это исправит гипотезу об ошибке.

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

Ответ 7

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'

Ответ 8

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

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

DBFiddle Demo

Предупреждение. Это не является выражением SARG, поэтому использование индекса не будет.

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