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.