Как вывести ненулевые значения sql
Выборка нулевых значений
После создания таблицы разработчик может указать, допустимо ли, чтобы в отдельных ее столбцах не содержались никакие значения. Когда в столбце не содержится никакого значения, это значит, что в нем содержится значение NULL.
Значение NULL подразумевает отсутствие какого-либо значения, в отличие от поля, содержащего или 0, или пустую строку, или просто несколько пробелов.
Для оператора SELECT предусмотрена специальная форма предложения WHERE, которая используется для проверки значений NULL в столбцах и содержит оператор IS NULL.
Синтаксис выглядит следующим образом:
Оператор IS NOT NULL позволяет выбрать строки, для которых значения в данном поле определены.
Найти номера расторгнутых договоров. (Если договор был расторгнут, то в поле retire_date содержится дата расторжения договора, для действующих договоров данное поле содержит значение NULL).
SQL:
SELECT contract_id
FROM tbl_contract
WHERE retire_date IS NOT NULL
MySQL SELECT только ненулевые значения
Можно ли сделать оператор select, который принимает только значения NOT NULL? Сейчас я использую это:
SELECT * FROM table
И тогда я должен отфильтровать нулевые значения в петле php. Есть ли способ сделать:
SELECT * (that are NOT NULL) FROM table
? Прямо сейчас, когда я выбираю *, я получаю val1, val2, val3, null, val4, val5, null, null и т.д., но я просто хочу получить значения, которые не равны нулю в моем результате. Возможно ли это без фильтрации с помощью цикла?
bryan sammon 12 март 2011, в 21:03
Поделиться
Что вы хотите, чтобы произошло, если есть строка, в которой некоторые столбцы имеют значения NULL, а другие столбцы не имеют значений NULL?
Mark Byers 12 март 2011, в 21:05
Я хотел бы получить только значения из столбцов, которые не являются нулевыми, и возвращать только значения столбцов в строке, которые не являются нулевыми. Прямо сейчас я использую цикл, чтобы отфильтровать их, возможно ли это сделать без цикла?
bryan sammon 12 март 2011, в 21:08
@bryan — Какая у вас структура таблицы? Все ли столбцы имеют одинаковый тип данных?
Martin Smith 12 март 2011, в 21:10
Да, все они имеют тип текстового значения
bryan sammon 12 март 2011, в 21:10
@bryan — Итак, как бы выглядел ваш идеальный набор результатов? Набор результатов из одного столбца, содержащий все ненулевые значения? Если не редактировать свой вопрос с примерами данных и желаемых результатов, будет полезно .
Martin Smith 12 март 2011, в 21:15
Да, я просто хотел бы получить все значения, которые не являются нулевыми из этой строки.
bryan sammon 12 март 2011, в 21:18
Что ж, вы могли бы сделать это с помощью UNION . WHERE coln IS NOT NULL но при этом таблица будет сканироваться один раз для каждого столбца. В MySQL нет оператора UNPIVOT который бы здесь помог. Поэтому, вероятно, наиболее эффективным способом было бы сделать это в вашем коде. Лучшее, что вы можете сделать, это исключить строки, где все столбцы имеют NULL . Вы уверены, что структура вашего стола нормализована?
Martin Smith 12 март 2011, в 21:23
Я не уверен насчет нормализации. Что нормализуется?
bryan sammon 12 март 2011, в 21:27
@ Брайан — Похоже, ваша таблица может иметь повторяющиеся группы по столбцам? (См. Статью Wiki для объяснения и предлагаемой альтернативной структуры, если это так. En.wikipedia.org/wiki/First_normal_form )
Martin Smith 12 март 2011, в 21:30
Спасибо мужчина, я собираюсь разобраться в этом
bryan sammon 12 март 2011, в 21:33
Показать ещё 8 комментариев
Поделиться:
7 ответов
Лучший ответ
Вы должны использовать IS NOT NULL . (Операторы сравнения = и <> обе дают UNKNOWN с NULL по обе стороны от выражения.)
SELECT * FROM table WHERE YourColumn IS NOT NULL;
Просто для полноты. Я упомянул, что в MySQL вы также можете отрицать null безопасный оператор равенства, но это не стандартный SQL.
SELECT * FROM table WHERE NOT (YourColumn NULL);
Отредактировано для отражения комментариев. Похоже, что ваша таблица может быть не в первой нормальной форме, и в этом случае изменение структуры может облегчить вашу задачу. Несколько других способов сделать это, хотя.
SELECT val1 AS val FROM your_table WHERE val1 IS NOT NULL UNION ALL SELECT val2 FROM your_table WHERE val2 IS NOT NULL /*And so on for all your columns*/
Недостатком вышеизложенного является то, что он сканирует таблицу несколько раз один раз для каждого столбца. Этого можно избежать из-за ниже, но я не тестировал это в MySQL.
SELECT CASE idx WHEN 1 THEN val1 WHEN 2 THEN val2 END AS val FROM your_table /*CROSS JOIN*/ JOIN (SELECT 1 AS idx UNION ALL SELECT 2) t HAVING val IS NOT NULL /*Can reference alias in Having in MySQL*/
Значение NULL в SQL – неизвестное значение
Примечание:
Во всех статьях текущей категории уроков по SQL используются примеры и задачи, основанные на учебной базе данных.
Приступая к изучению данного материала, рекомендуется ознакомиться с описанием учебной БД.
Даже для небольших баз данных часто встречаются ситуации, когда значение какого-либо поля таблицы может быть неизвестно. Причины возникновения подобных ситуаций могут быть разными, начиная ошибками ПО и проектирования БД, заканчивая особенностями бизнес-процессов организации.
Если рассмотреть диаграмму таблицы сотрудников учебной БД, то можно заметить, что последний столбец диаграммы указывает возможность наличия неизвестных значение в конкретном поле, а именно:

- Отчество. Вполне возможно, что сотрудником является гражданин страны, где не используется отчество.
- Дата увольнения может отсутствовать, так как увольнения еще не было.
- Группа может быть неизвестна, потому что сотрудник может быть не распределен в группу на каком-то из этапов приема на работу.
Важно понять, что неизвестные (отсутствующие) значения – это не ноль (для числовых полей) и не пустая строка (для текстовых полей). Так как ноль является вполне конкретным значением, например, 0 рублей задолженности, а пустая строка сообщает о том, что на данный момент ничего кроме строки нулевой длины в поле строки быть не должно. В примере с отчеством, приведенном выше, вместо значения NULL можно задать пустую строку и это внесло бы дополнительную ясность, что отчество сотрудника нет в принципе, а не то, что его забыли внести.
Поиск отсутствующих значений
Выше было определено, что NULL не является конкретным значением, поэтому нужно понять, как операторы сравнения с ним будут работать. Никакое значение не может быть равно (также быть больше или меньше) неизвестному значению, даже условие NULL = NULL является ложным. Чтобы определить отсутствующее значения используется специальное условие IS NULL (является неизвестным). И наоборот, если требуется найти известные значения, то задается условие IS NOT NULL.
Рассмотрим задачу.
Найти всех сотрудников, которые были когда-либо уволены.
Решение.
Если в поле «Дата_увольнения» таблицы сотрудников отсутствует значение, то сотрудники работают на данный момент. Следовательно, нужно найти строки, где значение известно. Следующий sql-запрос выведет 7 строк, удовлетворяющих решению:
USE CallCenter SELECT * FROM Сотрудники WHERE Дата_увольнения IS NOT NULL
Решим еще одну задачу.
Вывести непринятые звонки за 1 декабря 2014 года.
Решение.
Звонок считается непринятым, если в таблице «Звонки» в поле «Сотрудник» отсутствует id принявшего звонок оператора. Отфильтровав таблицу по полям «Сотрудник» и «Дата_Время», получим 184 строки, удовлетворяющих запросу:
USE CallCenter SELECT * FROM Звонки WHERE Сотрудник IS NULL AND Дата_Время >= '01/12/2014 00:00:00' AND Дата_Время < '02/12/2014 00:00:00'
Обработка неизвестных значений
Если в своих запросах, Вы будете использовать поля, которые допускают значения NULL, то обязательно обрабатывайте такие поля, чтобы избежать ошибок. Например, любые арифметические операции или объединения строк, где в качестве аргумента будет хотя бы одно значение NULL, вернут неизвестное значение.
Рассмотрим пример.
Необходимо определить стаж работы каждого сотрудника, включая уволенных, на текущий момент. Стаж вывести в днях.
Для определения стажа необходимо найти интервал (разницу) между датой найма сотрудника и датой увольнения. Для этого можно использовать функцию DATEDIFF (ее описание можно найти в документации Microsoft). Но как быть с не уволенными сотрудниками, у которых отсутствует значение даты увольнения? Если выполнить ниже приведенный запрос, то можно убедиться, что большинство строк не покажут стаж:
USE CallCenter SELECT id, DATEDIFF(DAY, Дата_найма, Дата_увольнения) AS Стаж FROM Сотрудники
Поэтому обработаем поле «Дата_увольнения», применив функции ISNULL (если первый аргумент является NULL, то функция возвращает второй аргумент) и GETDATE (возвращает текущую системную дату и время). Следующий запрос выведет стаж в каждой строке:
USE CallCenter SELECT id, DATEDIFF(DAY, Дата_найма, ISNULL(Дата_увольнения, GETDATE())) AS Стаж FROM Сотрудники
- Объединение таблиц – UNION
- Соединение таблиц – операция JOIN и ее виды
- Тест на знание основ SQL
Если материалы office-menu.ru Вам помогли, то поддержите, пожалуйста, проект, чтобы я мог развивать его дальше.
Как вывести ненулевые значения sql
Есть таблица. необходимо определить число столбцов, имеющих ненулевое значение. Как это сделать?
автор: Artemy (15.09.2005 в 21:05) письмо автору
mysql> SELECT * FROM table WHERE name<>'' OR name<>'NULL';
автор: cheops (15.09.2005 в 23:01) письмо автору
Только лучше воспользоваться функцией COUNT() - она автоматически не считает значения NULL
| SELECT COUNT(name) FROM table WHERE name<>''; |
автор: Artemy (15.09.2005 в 23:58) письмо автору
Прошу прошения, я не обратил внимание на то, что их надо было посчитать!
автор: beowulf (16.09.2005 в 09:48) письмо автору
здесь вычисляется количество ненулевых значений для 1 столбца, а как определить общее число таких столбцов в таблице? И как определить имена этих столбцов? Я уже второй день мучаюсь.
автор: Artemy (16.09.2005 в 10:26) письмо автору
Можно выполнить столько запросов, сколько имеется столбцов таблицы!
| mysql>SELECT COUNT(name) FROM table WHERE name<>'' OR name<>'NULL'; mysql>SELECT COUNT(date) FROM table WHERE date<>'' OR date<>'NULL'; mysql>SELECT COUNT(time) FROM table WHERE time<>'' OR time<>'NULL'; mysql>SELECT COUNT(email) FROM table WHERE email<>'' OR email<>'NULL'; mysql>SELECT COUNT(icq) FROM table WHERE icq<>'' OR icq<>'NULL'; |
автор: napTu3aH (16.09.2005 в 10:59) письмо автору
у меня Мускул 4.1.8 и такой запрос выводит количество только заполненых полей, пропуская пустые
| mysql>SELECT COUNT(name) FROM table |
автор: Ziq (18.09.2005 в 07:51) письмо автору
| mysql>SELECT COUNT(name) FROM table WHERE name<>'' OR name<>'NULL'; |
Вот этот запрос имеет неправильную структуру, во-первых, потому что функция count() и так выберает ненулевые значения и конструкция WHERE в данном случае не нужна. А, во-вторых, потому что name<>'NULL' не будет выбирать ненулевые значения, а будет выбирать столбцы, в записях которых нет слова NULL. Для выбора ненулевых значения нужно использовать name IS NOT NULL (или IS NULL для нулевых). А Ваш запрос равносилен name<>'jkhsdajkhJjhskjshdj23'.
автор: cheops (18.09.2005 в 12:48) письмо автору
>во-первых, потому что функция count() и так выберает ненулевые значения и конструкция
>WHERE в данном случае не нужна.
Это не совсем так, функция COUNT() выбирает только значения не равные NULL, т.е. пустые строки она будет считать.
автор: napTu3aH (16.09.2005 в 10:28) письмо автору
| SELECT COUNT( 1 )+COUNT( 2 ) + COUNT( 3 ) AS num FROM '$table' |
Так можно перечислить хоть все столбцы в таблицы и вывести общее число записей в ней на равных нулю.
Хотя если столбцов больше 10 это уже весьма утруждающе, да и запрос не маленький получаеться. Думаю что есть варианты по проще
автор: cheops (16.09.2005 в 13:17) письмо автору
В смысле общее число столбцов?
автор: beowulf (16.09.2005 в 19:02) письмо автору
есть таблица. в ней много столбцов. в некоторых столбцах одни 0. мне надо подсчитать количество столбцов имеющих хотя-бы одно ненулевое значение и вывести наименования этих столбцов, причем желательно это сделать при помощи одного запроса. Хотя я уже начал сомневаться в том, что такое возможно
автор: cheops (16.09.2005 в 20:11) письмо автору
SQL не поощраяет манипулирование столбцами, если в таблице очень много столбцов и возникла потребность управлять ими - нужно разбивать таблицу на несколько, т.е. проводить процедуру нормализации.