loading..
Русский    English
08:37
листать

Еще о NULL-значениях стр. 3

Сравнение строк, содержащих NULL-значения

Как известно, предикаты простого сравнения с NULL-значениями дают истинностное значение UNKNOWN, т.е. ни TRUE и ни FALSE, что означает "неизвестно". Поэтому не стоит удивляться, что в одних случаях, при сравнении между собой NULL-значений, они считаются равными друг другу, а других случаях - нет. Поясним сказанное на примерах.

Рассмотрим соединение двух одинаковых строк, содержащих NULL-значения, по равенству всех столбцов.

Консоль
Выполнить
  1. WITH A AS (
  2. SELECT 'a' a, NULL b
  3. )
  4. , B AS (
  5. SELECT 'a' a, NULL b
  6. )
  7. SELECT * FROM A JOIN B ON A.a=B.a AND A.b=B.b;

В этом случае соединяться будут только те строки, для которых предикат соединения есть TRUE. Поскольку предикат соединения в примере оценивается как UNKNOWN, в результате мы не получим ни одной строки.

Однако пересечение запросов (так же, как объединение и разность) считает эти строки идентичными:

Консоль
Выполнить
  1. WITH A AS (
  2. SELECT 'a' a, NULL b
  3. )
  4. , B AS (
  5. SELECT 'a' a, NULL b
  6. )
  7. SELECT * FROM A
  8. INTERSECT
  9. SELECT * FROM B;

a    b
a    NULL

Можно сделать вывод о том, что при горизонтальных операциях NULL-значения не считаются равными (и неравными, впрочем, тоже), а при вертикальных трактуются как равные. В частности, при группировке по столбцу, содержащему NULL-значения, последние образуют одну группу.

В заключение рассмотрим несколько решений задачи определения количества принтеров с неизвестной ценой. Таблица PrinterN отличается от таблицы Printer тем, что для пары моделей цена установлена в NULL.

(1) От общего числа строк отнимем число строк с известной ценой.

Консоль
Выполнить
  1. SELECT COUNT(*) - COUNT(price) qty FROM printerN;

(2) Использование предиката IS NULL для подсчёта строк, для которых цена неизвестна.

Консоль
Выполнить
  1. SELECT COUNT(*) FROM printerN WHERE price IS NULL;

(3) Группируем по цене и отбираем группу с неизвестной ценой, используя HAVING.

Консоль
Выполнить
  1. SELECT COUNT(*) FROM printerN GROUP BY price HAVING price IS NULL;


Bookmark and Share
Страницы: 1 2 3
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100