Чи можна зробити оператор вибору, який приймає тільки значення NOT NULL?
На даний момент я використовую це:
SELECT * FROM table
А потім я повинен відфільтрувати нульові значення за допомогою циклу php.
Чи є спосіб це зробити:
SELECT * (that are NOT NULL) FROM table
?
Зараз при виборі * я отримую val1,val2,val3,null,val4,val5,null,null і т.д..... але я просто хочу отримати в результаті значення, які не є нульовими. Чи можливо це зробити без фільтрації з циклом?
Слід використовувати 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*/
Ви можете відфільтрувати рядки, які містять значення 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
І я згоден з Мартіном, що якщо вам потрібно це зробити, то вам, ймовірно, слід змінити дизайн вашої бази даних.
Select * from your_table
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;
Єдиним недоліком такого підходу є те, що порівнювати можна лише 5 стовпців, після чого результат завжди буде хибним, тому я порівнюю лише ті поля, які можуть бути NULL
.