2016-12-23 2 views
0

В Oracle: = «» и «нулевым символом» возврата Нулевые значенияСтолбцы с нулевыми значениями в SQL Server против Oracle

SELECT COL1 FROM TABLE WHERE COL1='' --> RETURN COL1 WITH NULL VALUES 
SELECT COL1 FROM TABLE WHERE COL1 IS NULL --> RETURN COL1 WITH NULL VALUES 

Оба запроса возвращают одинаковый набор строк.

В Microsoft SQL:

SELECT COL1 FROM TABLE WHERE COL1='' --> RETURN COL1 WITH <BLANK> VALUES 
SELECT COL1 FROM TABLE WHERE COL1 IS NULL --> RETURN COL1 WITH <NULL> VALUES 

Здесь первые и вторые запросы возвращают различные наборы строк.

Почему существует разница между набором результатов Microsoft SQL и набором результатов Oracle?

Как я мог получить оба набора строк в Microsoft SQL? (Значения, которые являются «и значениями, которые являются NULL).

+1

Потому что '' '(пустая строка) 'is ** NOT ** равно' NULL'. Не уверен насчет 'Oracle' –

+0

В' Oracle' пустая строка автоматически преобразуется в нуль. –

ответ

0

В SQL Server '' не является нулевым. В Oracle его немного сложнее x char := '' не равно нулю в PL/SQL но varchar2 пустая строка '' точно так же, как null, как описано here И в случае запросов это varchar2 так состояние COL = '' никогда не верно.

Если вам нужно условие, которое будет работать в обеих БД, используйте функцию coalesce.

select * from TAB 
    where coalesce(COL,'SOME_UNIQUE_STRING') = coalesce(FILTER_PARAM, 'SOME_UNIQUE_STRING') 

Такое условие должно возвращать строки, когда COLUMN равно FILTER, а также как нулевые или пустые строки.

+0

Спасибо Kacper за информацию. –

0

Для извлечения обоих наборов данных вы можете использовать isnull.

SELECT COL1 FROM TABLE WHERE ISNULL(COL1, '') = '' 

Oracle автоматически преобразует пустые строки в нулевые значения, а sql-сервер - нет, поэтому результирующие наборы различны.

Вы можете найти более подробную информацию об этом здесь: Why does Oracle 9i treat an empty string as NULL?

+0

В Oracle нет 'isnull'. http://stackoverflow.com/questions/3523036/what-is-the-oracle-equivalent-of-sql-servers-isnull-function – Kacper

+0

Большое спасибо за ссылку. Теперь я мог понять различия. –

0

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

Таким образом мы оцениваем значение col, когда значение null или пусто, равное одному и тому же значению для сравнения. Поскольку, насколько мне известно, независимая СУБД, это должно работать в обоих.

SELECT * 
FROM Table 
WHERE case when col is NULL or col = '' then 1 else 0 end = 1 
Смежные вопросы