it-roy-ru.com

Oracle/PL SQL/SQL нулевое сравнение в предложении где

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

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

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 может иметь значение null, A, B или C Если переменная Y равна нулю, я хочу выбрать все записи, где column2 равно нулю, иначе, когда column2 равно A, B или C.

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

CURSOR c_results IS
SELECT * FROM TABLEX where column2 IS NULL

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

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

18
user2447740

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

WHERE (column2 = variableY) OR (variableY IS NULL AND column2 IS NULL)
24
Lasse Vågsæther Karlsen

Оракул спрашивает Тома говорит:

where decode( col1, col2, 1, 0 ) = 0  -- finds differences

или же

where decode( col1, col2, 1, 0 ) = 1  -- finds sameness - even if both NULL

Безопасное сравнение пустых столбцов как равных

6
rghome

Ниже аналогичен «верхнему» ответу, но более лаконичен:

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

2
drjumper

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

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

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

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

(правка) Вы также можете рассмотреть:

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

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

2
Stef Heyenrath

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

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

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

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

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

1
JOATMON

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

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

DBFiddle Demo

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

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

0
Lukasz Szozda

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

0
karel
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'
0
Kevin