ANSI эквивалент IS NULL

Я пытаюсь найти способ ANSI для записи T-SQL «IS NULL». (исправлено, было 'IN NULL') Некоторые сообщения в Интернете говорят, что вы можете использовать coalesce, чтобы заставить его работать как 'IS NULL'

Причина, по которой мне нравится это делать: переносимый код. И запрос должен возвращать строки NULL.

Пока что я создал это:

SELECT empid,
       firstname,
       lastname,
       country,
       coalesce(region,'unknown') AS regions ,
       city
FROM HR.Employees

Результат выглядит так:

empid   firstname           lastname       country  regions city
1           Sara            Davis           USA     WA      Seattle
2           Don             Funk            USA     WA      Tacoma
3           Judy            Lew             USA     WA      Kirkland 
4           Yael            Peled           USA     WA      Redmond
5           Sven            Buck            UK      unknown London
6           Paul            Suurs           UK      unknown London
7           Russell         King            UK      unknown London
8           Maria           Cameron         USA     WA      Seattle
9           Zoya            Dolgopyatova    UK      unknown London

Я определил строки, которые являются NULL, но как мне отфильтровать их из этого набора?


person chihwah li    schedule 09.02.2013    source источник
comment
Скажите, если есть лучший способ фильтрации.   -  person chihwah li    schedule 09.02.2013
comment
Итак, вы хотите, чтобы ваш запрос возвращал все вышеперечисленные строки, кроме тех, у которых regions значение unknown?   -  person Daniel Kelley    schedule 09.02.2013
comment
Вы пытаетесь сказать, что unknown это NULL?   -  person Kermit    schedule 09.02.2013
comment
Вы хотите видеть только NULL-строки?   -  person flup    schedule 09.02.2013
comment
@chihwahli. . . Я предполагаю, что первая строка вашего вопроса касается IS NULL, а не IN NULL (с которым я не знаком).   -  person Gordon Linoff    schedule 10.02.2013
comment
@ Гордон: правильно. Спасибо.   -  person chihwah li    schedule 10.02.2013
comment
@ Даниэль: хотел, чтобы он работал, либо вернись ... теперь он работает. Спасибо за попытку.   -  person chihwah li    schedule 10.02.2013
comment
@njk: я пытался отфильтровать строки с NULLS. Не знал, как продолжить. Но теперь я знаю. Спасибо за вопрос.   -  person chihwah li    schedule 10.02.2013


Ответы (3)


Оба IS NULL и COALESCE являются стандартом ANSI и доступны почти во всех разумных базах данных. Я думаю, что вам нужна конструкция:

where region IS NULL

Это стандартный синтаксис.

Чтобы COALESCE работал как IS NULL, требуется значение, которого, как вы знаете, нет в данных:

where coalesce(region, '<null>') <> '<null>'

Однако вам потребуются другие значения для дат и чисел.

person Gordon Linoff    schedule 09.02.2013
comment
Я прочитал несколько страниц в сети, где говорилось, что Я НЕ ТОЛЬКО T-SQL. Но это было неправильно. Спасибо за исправление. Я переписал свой исходный код, просто чтобы попробовать coalesce: - person chihwah li; 10.02.2013
comment
ВЫБЕРИТЕ empid, имя, фамилию, страну, объединение (регион, 'неизвестно') AS, регионы, город ИЗ HR. Сотрудники, где объединяются (регион, '‹null›) =' ‹null› 'или region = N'WA' Возвращает строки с NULL теперь. Затем заархивируем его и в будущем будем использовать IS NULL. Спасибо еще раз. - person chihwah li; 10.02.2013

Кажется, вы сбиваете с толку IS NULL (предикат, который проверяет, является ли значение нулевым) и специальную функцию T-SQL ISNULL(value, replace) (без пробелов и параметров после него), которая похожа, но не идентична COALESCE.

Подробную информацию о том, как COALESCE и ISNULL различаются для T-SQL.

Незначительные различия, например, какой тип возвращается и что происходит, когда все аргументы равны нулю, ISNULL - это функция, которая возвращает первый аргумент, если он не равен нулю, или второй аргумент, если это так. COALESCE возвращает первый ненулевой аргумент (может принимать более двух).

В результате каждый из них может использоваться для решения вашей проблемы по-разному и с немного разными результатами.

person James    schedule 03.03.2017

IS NULL является допустимым ANSI SQL-92, называется нулевым предикатом.

<null predicate> ::= <row value constructor> IS [ NOT ] NULL

См. SQL-92, параграф 8.6.

Итак, WHEREcolumn nameIS NULL совершенно верно.

Бит, в котором ANSI SQL обрабатывает значения NULL, отличные от T-SQL, - это когда вы пишете WHERE имя столбца = NULL или WHERE имя столбца <> NULL. См. SET ANSI NULLS (Transact-SQL).

person flup    schedule 09.02.2013
comment
Большое спасибо за то, что указали, что это ANSI, прочитали не те страницы и ошиблись. - person chihwah li; 10.02.2013