Количество 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 не будет опубликован. Обязательные поля помечены *