MySQL SELECT только ненулевые значения


264

Можно ли сделать оператор выбора, который принимает только значения NOT NULL?

Прямо сейчас я использую это:

SELECT * FROM table

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

Есть ли способ сделать:

SELECT * (that are NOT NULL) FROM table

?

Прямо сейчас, когда я выбираю *, я получаю val1, val2, val3, null, val4, val5, null, null и т. Д. .... но я просто хочу получить значения, которые не равны null в моем результате. Возможно ли это без фильтрации с помощью петли?


2
Что вы хотите сделать, если есть строка, в которой некоторые столбцы имеют значения NULL, а другие столбцы не имеют значений NULL?
Марк Байерс

Я хотел бы получить только значения из столбцов, которые не являются нулевыми, и возвращать только значения столбцов в строке, которые не являются нулевыми. Прямо сейчас я использую цикл, чтобы отфильтровать их, возможно ли это сделать без цикла?
Брайан Саммон

1
@bryan - Какая у вас структура таблицы? Все ли столбцы имеют одинаковый тип данных?
Мартин Смит

1
@bryan - Итак, как бы выглядел ваш идеальный набор результатов? Набор результатов из одного столбца, содержащий все ненулевые значения? Если бы не редактирование вашего вопроса с примерами данных и желаемых результатов было бы полезно ...
Мартин Смит

2
@ Брайан - Похоже, ваша таблица может иметь повторяющиеся группы по столбцам? (См. Статью Wiki для объяснения и предлагаемой альтернативной структуры, если это так. En.wikipedia.org/wiki/First_normal_form )
Мартин Смит

Ответы:


453

Вы должны использовать IS NOT NULL. (Операторы сравнения =и <>оба дают UNKNOWNс NULLкаждой стороны выражения.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Просто для полноты я упомяну, что в MySQL вы также можете отменить оператор нулевого безопасного равенства, но это не стандартный 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*/

2
Большое спасибо .. Это помогло :)
DfrDkn

В последнем подходе вы использовали CASEоператор, а не CASEфункцию. Так не должно ли быть, END CASEа не END в SELECT CASE ...части?
Истак Ахмед

Для не очень опытных людей, вы можете объяснить последнее решение? Ли idx рум первым SELECTпришел из idxв секунду SELECT? Чего CASEпытается достичь это утверждение? Что на SELECTсамом деле делает второй ? И вы делаете внутреннее соединение, а не перекрестное соединение, верно?
Истак Ахмед

Я не думаю, что это отвечает на вопрос. Похоже, что OP хотел выбрать (я предполагаю одну конкретную) строку, но исключить все столбцы из этого результата, которые были нулевыми - этот ответ требует, чтобы вы либо указали, какие столбцы не могут быть пустыми (что является совершенно другой проблемой), либо указать все столбцы, непригодные для таблиц с несколькими столбцами
csey

(например, что-то вроде SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey

18

Вы можете отфильтровать строки, содержащие значение NULL в определенном столбце:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL

Если вы хотите отфильтровать строки, содержащие ноль в любом столбце, попробуйте это:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL

Обновление: на основе ваших комментариев, возможно, вы хотите это?

SELECT * FROM
(
    SELECT col1 AS col FROM yourtable
    UNION
    SELECT col2 AS col FROM yourtable
    UNION
    -- ...
    UNION
    SELECT coln AS col FROM yourtable
) T1
WHERE col IS NOT NULL

И я согласен с Мартином, что если вам нужно сделать это, то вам, вероятно, следует изменить дизайн базы данных.


Я не уверен, объяснил ли я это достаточно хорошо, но я постараюсь немного лучше. Прямо сейчас, когда я выбираю *, я получаю val1, val2, val3, null, val4, val5, null, null и т. Д. .... но я просто хочу получить значения, которые не равны null в моем результате. Возможно ли это без фильтрации с помощью петли?
Брайан Саммон

@bryan - Не могли бы вы объяснить, какие столбцы *возвращает? Возможно, приведите несколько примеров данных в вашем вопросе, так как из вашего комментария выше не ясно, все ли это один столбец.
Мартин Смит

Прямо сейчас * возвращает все мои значения в строке. то есть val1, val2, val3, ноль, val4, val5, ноль, ноль. Но я хочу, чтобы он только возвращал значения столбца, которые не являются нулевыми. Прямо сейчас я делаю это с помощью цикла, чтобы отфильтровать значения после того, как он вернет результат.
Брайан Саммон

13
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

Единственным недостатком этого подхода является то, что вы можете сравнивать только 5 столбцов, после чего результат всегда будет ложным, поэтому я сравниваю только те поля, которые могут быть NULL.


8

Я нашел это решение:

Этот запрос выбирает последнее не нулевое значение для каждого столбца.

пример


Если у вас есть стол:

id|title|body
1 |t1   |b1
2 |NULL |b2
3 |t3   |NULL

ты получаешь:

title|body
t3   |b2

запрос


SELECT DISTINCT (

  SELECT title
  FROM test
  WHERE title IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) title, (

  SELECT body
  FROM test
  WHERE body IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) body
FROM test

Я надеюсь помочь вам.


GROUP_CONCAT (тело) КАК тело
Равиндра Сингх

2

Я использую \!команду в MySQL для извлечения значений NULL из оболочки:

\! mysql -e "SELECT * FROM table WHERE column = 123456\G" | grep -v NULL

Лучше всего работает с правильным, .my.cnfгде указана ваша база данных / имя пользователя / пароль. Таким образом , вы просто должны окружить selectс \! mysql eи | grep -v NULL.


1

Следующий запрос работает на меня

когда я установил значение по умолчанию для столбца NULL, то

select * from table where column IS NOT NULL

и когда я установил значение по умолчанию ничего тогда

select * from table where column <>''


0

MYSQL НЕ НУЛЯЕТСЯ С СОЕДИНЕНИЯМИ И ВЫБОРОМ, ВСТАВЛЯЙТЕ В, УДАЛЯЙТЕ И ЛОГИЧЕСКИЙ ОПЕРАТОР, КАК ИЛИ НЕ

Using IS NOT NULL On Join Conditions

 SELECT * FROM users 
 LEFT JOIN posts ON post.user_id = users.id 
 WHERE user_id IS NOT NULL;

 Using IS NOT NULL With AND Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 AND mobile_number IS NOT NULL;

Using IS NOT NULL With OR Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 OR mobile_number IS NOT NULL;

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.