MySQL SELECT не має нульових значень


264

Чи можливо зробити оператор select, який приймає лише значення NOT NULL?

Зараз я використовую це:

SELECT * FROM table

І тоді мені доведеться відфільтрувати нульові значення з циклу php.

Чи є спосіб зробити:

SELECT * (that are NOT NULL) FROM table

?

Зараз, коли я вибираю *, я отримую val1, val2, val3, null, val4, val5, null, null і т. Д. ...., але я просто хочу отримати значення, які не є нульовими в моєму результаті. Чи можливо це без фільтрування за допомогою циклу?


2
Що ви хочете зробити, якщо є рядок, де деякі стовпці мають значення NULL, а інші стовпці не мають NULL?
Марк Байєрс

Я хотів би отримати лише значення зі стовпців, які не є нульовими, і повернути лише значення стовпців у рядку, які не є нульовими. Зараз я використовую цикл для їх фільтрування, чи можна це зробити без циклу?
Брайан Саммон

1
@bryan - Яка структура вашої таблиці? Чи всі стовпці мають однаковий тип даних?
Мартін Сміт

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

2
@bryan - Здається, що у вашій таблиці може бути повторюваних груп через стовпці? (Див. Статтю Wiki для пояснення та запропоновану альтернативну структуру, якщо це так. En.wikipedia.org/wiki/First_normal_form )
Мартін Сміт

Відповіді:


452

Ви повинні використовувати 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? І ви робите внутрішнє з'єднання, а не перехресне з'єднання, правда?
Істіак Ахмед

Я не думаю, що це відповідає на питання. Це звучало так, що ОП хотів вибрати (я припускаю один конкретний) рядок, але виключити всі стовпці з цього результату, які були недійсними - ця відповідь вимагає вказати, які стовпці не мають бути нульовими (це цілком інша проблема) або вкажіть усі стовпці, непридатні для таблиць з багатьма стовпцями
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 і т. Д. ...., але я просто хочу отримати значення, які не є нульовими в моєму результаті. Чи можливо це без фільтрування за допомогою циклу?
Брайан Саммон

@bryan - Чи можете ви пояснити, які стовпці *повертаються? Можливо, наведіть трохи прикладних даних у своєму запитанні, оскільки з коментарів вище не зрозуміло, чи все це один стовпець.
Мартін Сміт

Зараз * повертає всі мої значення у рядку. тобто val1, val2, val3, null, val4, val5, null, null. Але я хочу, щоб він повертав лише значення стовпців, які не є нульовими. Зараз я роблю це з циклом, щоб відфільтрувати значення після повернення результату.
Брайан Саммон

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 (body) AS body
Равіндра Сінгх

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.