Informix SQL - запрос простого выбора возвращает неожиданные результаты - PullRequest
1 голос
/ 17 июня 2011

Следуйте этому, это действительно очевидно и просто.По некоторым причинам результаты различаются для разных запросов и углов подхода для подмножеств данных.Помните, что поле correct_addr является полем char(1) с допустимыми нулями.

select distinct correct_addr, count(*) from id_rec group by correct_addr;

correct_addr       (count(*))
                         2477
N                          80
Y                       84013

3 row(s) retrieved.

Хорошо, поэтому correct_addr содержит 3 различных значения: "N", "Y" и"" или "" или NULL

Итак, я попробую вот что:

select count(*) from id_rec where correct_addr <> 'N';

      (count(*))
           84013

Что случилось с 2477 записями, которые имеют это пустое значение?

Другойпопробуйте под другим углом:

select count(*) from id_rec where correct_addr in (null,'',' ','Y');

      (count(*))
           84013

То же самое происходит ....

Так что здесь происходит?Почему движок SQL (?) Не распознает пустое значение в последних 2 операторах SQL?Он обнаруживает это в первом запросе с группировкой, но больше нигде.

У кого-нибудь есть идеи относительно того, почему происходит этот тип вещей?

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

NULLs требует специальной обработки в SQL.

Попробуйте

select count(*) 
from id_rec 
where correct_addr <> 'N' 
    or correct_addr is null; 

См. Здесь объяснение обработки значений NULL .

0 голосов
/ 17 июня 2011

Сравнение NULL всегда ложно.И пустая строка или один пробел - это значение, которое не равно NULL.

Однако GROUP BY распознает его и посчитает его.

Попробуйте эти

select count(*) from id_rec
where correct_addr <> 'N' or correct_addr IS NULL

select count(*) from id_rec
where COALESCE(correct_addr, 'X') <> 'N' 


select count(*) from id_rec
where COALESCE(correct_addr, ' ') in (' ','Y');

Также,COUNT (столбец) будет игнорировать значения NULL, поэтому еще несколько попыток

select count(correct_addr), COUNT(*) from id_rec GROUP BY correct_addr

select count(correct_addr), COUNT(*) from id_rec
where correct_addr <> 'N' or correct_addr IS NULL

Примечание: char (1) всегда будет заполняться пробелом

...