2013-02-09 3 views
3

Я пытаюсь найти способ ANSI для записи T-SQL «IS NULL». (исправлено, было «IN NULL») Некоторые сообщения в Интернете говорят, что вы можете использовать coalesce, чтобы заставить его работать как «IS NULL»ANSI эквивалент 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, но как отфильтровать их из этого множества?

+0

Если есть лучший способ фильтрации, расскажите. –

+0

Итак, вы хотите, чтобы ваш запрос возвращал все вышеперечисленные строки, кроме тех, у которых значение 'regions'' unknown'? –

+0

Вы пытаетесь сказать 'unknown'' 'NULL'? – Kermit

ответ

6

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

where region IS NULL 

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

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

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

Однако вы нужны разные значения для даты и номера.

+0

Я прочитал несколько страниц в Интернете, сказав, что IS NOT был только T-SQL. Но это было неправильно. Спасибо за исправление. Я переписал свой первоначальный код, просто чтобы опробовать: –

+0

ВЫБЕРИТЕ empid, firstname, lastname, country, coalesce (регион, 'неизвестно') AS регионы, город FROM HR.Employees где coalesce (регион, '') = '' или region = N'WA ' Возвращает строки с NULL сейчас. Будет архивировать его и использовать в будущем «IS NULL». Еще раз спасибо. –

2

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

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

См. SQL-92, п. 8.6.

So WHERE название колонки IS NULL совершенно в порядке.

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

+0

Большое спасибо за указание, что это ANSI, читайте неправильные страницы и думайте неправильно. –

0

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

Для получения информации о том, как COALESCE и ISNULL отличаются для T-SQL, см. SQL - Difference between COALESCE and ISNULL?.

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

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