Еще о NULL-значениях стр. 3 |
|||||||
Сравнение строк, содержащих NULL-значенияКак известно, предикаты простого сравнения с NULL-значениями дают истинностное значение UNKNOWN, т.е. ни TRUE и ни FALSE, что означает "неизвестно". Поэтому не стоит удивляться, что в одних случаях, при сравнении между собой NULL-значений, они считаются равными друг другу, а других случаях - нет. Поясним сказанное на примерах. Рассмотрим соединение двух одинаковых строк, содержащих NULL-значения, по равенству всех столбцов.
В этом случае соединяться будут только те строки, для которых предикат соединения есть TRUE. Поскольку предикат соединения в примере оценивается как UNKNOWN, в результате мы не получим ни одной строки. Однако пересечение запросов (так же, как объединение и разность) считает эти строки идентичными:
Можно сделать вывод о том, что при горизонтальных операциях NULL-значения не считаются равными (и неравными, впрочем, тоже), а при вертикальных трактуются как равные. В частности, при группировке по столбцу, содержащему NULL-значения, последние образуют одну группу. В заключение рассмотрим несколько решений задачи определения количества принтеров с неизвестной ценой. Таблица PrinterN отличается от таблицы Printer тем, что для пары моделей цена установлена в NULL. (1) От общего числа строк отнимем число строк с известной ценой. (2) Использование предиката IS NULL для подсчёта строк, для которых цена неизвестна. (3) Группируем по цене и отбираем группу с неизвестной ценой, используя HAVING.
|