Количество NULL в запросе

При определении количества элементов в виде «NULL» в результирующей таблице запроса нам возвращается значение «0».

1. Искусственно сформируем таблицу с двумя строками, где колонка будет со значением "NULL":

ВЫБРАТЬ
NULL КАК Поле1
ПОМЕСТИТЬ ВременнаяТаблица

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
NULL
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(ВременнаяТаблица.Поле1) КАК Поле1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица

 

В результате получим таблицу:

 

 

2. Немного изменим запрос.

Добавим в одни из первых запросов значение:

ВЫБРАТЬ
NULL КАК Поле1
ПОМЕСТИТЬ ВременнаяТаблица

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(ВременнаяТаблица.Поле1) КАК Поле1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица

 

В результате получим таблицу:

 

 

3. Попробуем добавить в запрос "РАЗЛИЧНЫЕ":

ВЫБРАТЬ
NULL КАК Поле1
ПОМЕСТИТЬ ВременнаяТаблица

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВременнаяТаблица.Поле1) КАК Поле1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица

 

В результате получим таблицу:

 

Вывод:

Известно, что NULL не является значением (его отсутствие), но для меня было не очевидно данное поведение.

18 Comments

  1. soft_wind

    просто немного по другому надо строить запросы и все отлично считается, попробуйте так

    Выбрать null как п1 поместить Таб
    Объединить все Выбрать null
    Объединить все Выбрать null
    Объединить все Выбрать 1
    ;
    выбрать
    ЕстьNull(таб.п1,»Это Null») как п1,
    Количество(*)
    сгруппировать по
    Таб.п1
    

    Показать

    Reply
  2. SnubbyAston

    Забавное наблюдение. Интересно, а сюрпризов от других СУБД не будет (cам проверил на файловой и MS SQL)?

    Reply
  3. VmvLer

    Кэп, агрегаты КОЛИЧЕСТВО(), СУММА() полностью осмыслены?

    Reply
  4. VmvLer

    вы же осмыслили тезис

    Известно, что NULL не является значением (его отсутствие)

    а теперь примените это знание к агрегату

    Reply
  5. dhurricane

    Эх, вот и мое пришло время вставить свое занудное замечание.

    Коллеги, если не обращаться ни к документации, ни к справке, ни к книгам, можно еще много найти неожиданностей.

    Функция подсчитывает количество значений параметра, попавших в выборку. В отличие от других агрегатных функций, функция КОЛИЧЕСТВО допускает три способа использования:

    ● Функция позволяет подсчитать количество значений указанного поля, не равных NULL.

    ● Функция позволяет подсчитать количество различных значений указанного поля, не равных NULL. Для этого перед спецификацией поля нужно указать ключевое слово РАЗЛИЧНЫЕ.

    ● Функция позволяет подсчитать количество строк в результате запроса. Для этого в качестве параметра функции нужно указать звездочку «*».

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

    https://its.1c.ru/db/v8314doc#bookmark:dev:TI000000494

    Reply
  6. bulpi

    (1)

    Лениво проверять, но ИМХО , в запросе ошибка.

    Reply
  7. bulpi

    (5)

    Это понятно. А как посчитать NULL, если надо ?

    Reply
  8. dhurricane

    (7) Уточните, пожалуйста, в какой ситуации? Не могу ответить в общем случае, т.к. они довольно разнообразны, соответственно и счет будет разнообразным.

    Reply
  9. soft_wind

    (6) нет там ошибки, я же его в консоли писал, уж кнопку: Выполнить нажать мне не лень было

    Reply
  10. Nadushka74

    А не проще через ЕстьNull — определить как удобное для вас значение и его посчитать?

    Ну для меня это самый удобный способ, так как часто приходиться выводить таблицы, где может быть Null. для дальнейшей работы.

    А вообще сам по себе null конечно в многих функция отрабатывает не так ожидаешь, но надо быть к этому готовым. ))

    Reply
  11. Fragster

    (7) Сумма(Выбор Когда Поле есть NULL тогда 1 иначе 0 Конец)

    Reply
  12. Unk92

    (5) Посмотрев на документацию должна сработать конструкция

    КОЛИЧЕСТВО(*) — КОЛИЧЕСТВО(ТаблицаДанных.Поле1) КАК Результат

    Но это не очевидное решение и при чтении кода, потом явно будут проблемы =)

    Reply
  13. dhurricane

    (12) Можно попробовать дать понятный псевдоним. 🙂 Либо воспользоваться конструкцией из (11). В конце концов задача подсчета количества строк, где есть значение NULL не самая распространенная, поэтому из контекста должно быть понятно, что это за выражение запроса.

    Reply
  14. RomanCrow13

    (11)

    Или

    Количество(ЕСТЬNULL(Поле, 0)). Вместо 0 можно вроде даже Неопределено поставить. Главное, что не Null)

    Reply
  15. Fragster

    (14) у вас не количество значений null, а количество с учетом null. Так и сумма(1) можно использовать.

    Reply
  16. soft_wind

    (15) а там группировка стоит по полю со значением НУЛЛ, как раз и получаем количество строк (как писали выше) со значением НУЛЛ

    а вот интересно почему группировка понимает НУЛЛ? и правильно группирует по нему?

    Reply
  17. RomanCrow13

    (15) в таком случае и смысл задачи отсутствует. Чисто только для теории.. Правда, какой смысл использовать ЕСТЬNULL(Null, 0), если null всегда есть null:)

    Reply
  18. ImHunter
    ВЫБРАТЬ
    NULL КАК п1
    ПОМЕСТИТЬ Таб
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
    NULL
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
    NULL
    ;
    
    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    КОЛИЧЕСТВО(1) КАК Поле1
    ИЗ
    Таб КАК Таб
    ГДЕ
    Таб.п1 ЕСТЬ NULL

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *