MySQL SELECT nie tylko wartości zerowe

264

Czy jest możliwe wykonanie instrukcji select, która przyjmuje tylko wartości NOT NULL?

Obecnie używam tego:

SELECT * FROM table

A potem muszę odfiltrować wartości zerowe za pomocą pętli php.

Czy istnieje sposób na:

SELECT * (that are NOT NULL) FROM table

?

W tej chwili, gdy wybieram * otrzymuję val1, val2, val3, null, val4, val5, null, null itp.… Ale chcę tylko uzyskać wartości, które nie są null w moim wyniku. Czy jest to możliwe bez filtrowania za pomocą pętli?

Bryan Sammon
źródło
2
Co chcesz zrobić, jeśli istnieje wiersz, w którym niektóre kolumny mają wartości NULL, a inne kolumny nie mają wartości NULL?
Mark Byers,
Chciałbym uzyskać tylko wartości z kolumn, które nie są zerowe, i zwracam tylko wartości kolumn w wierszu, które nie są zerowe. Teraz używam pętli, aby je odfiltrować, czy można to zrobić bez pętli?
bryan sammon
1
@bryan - Jaka jest twoja struktura stołu? Czy wszystkie kolumny mają ten sam typ danych?
Martin Smith,
1
@bryan - Jak wyglądałby wtedy twój idealny zestaw wyników? Zestaw wyników z jedną kolumną zawierający wszystkie wartości niepuste? Jeśli nie edytowanie pytania z przykładowymi danymi i pożądanymi wynikami, byłoby pomocne ...
Martin Smith
2
@bryan - Wygląda na to, że twoja tabela może mieć powtarzające się grupy w kolumnach? (Zobacz artykuł na Wiki, aby uzyskać wyjaśnienie i sugerowaną alternatywną strukturę, jeśli tak jest w przypadku en.wikipedia.org/wiki/First_normal_form )
Martin Smith

Odpowiedzi:

452

Powinieneś użyć IS NOT NULL. (Operatory porównania =i <>oba dają UNKNOWNz NULLpo obu stronach wyrażenia.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Dla kompletności wspomnę, że w MySQL możesz również zanegować zerowy bezpieczny operator równości, ale nie jest to standardowy SQL.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

Edytowane w celu odzwierciedlenia komentarzy. Wygląda na to, że Twój stół może nie być w pierwszej normalnej formie. W takim przypadku zmiana struktury może ułatwić zadanie. Kilka innych sposobów na zrobienie tego ...

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*/

Wadą powyższego jest to, że skanuje tabelę wiele razy jeden raz dla każdej kolumny. Można tego uniknąć poniżej, ale nie testowałem tego w 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*/
Martin Smith
źródło
2
Wielkie
W ostatnim podejściu użyłeś CASEinstrukcji, a nie CASEfunkcji. Czy nie powinno być END CASEzamiast tego END w tej SELECT CASE ...części?
Istiaque Ahmed,
Czy dla osób, które nie są ekspertami, możesz wyjaśnić ostatnie rozwiązanie? Czy idx rom pierwszy SELECTpochodzi z idxdrugiego SELECT? Co CASEoświadczenie próbuje osiągnąć? Co SELECTwłaściwie robi drugi ? I robisz połączenie wewnętrzne, a nie krzyżowe, prawda?
Istiaque Ahmed,
Nie sądzę, że to odpowiada na pytanie. Brzmiało to tak, jakby OP chciał wybrać (zakładam jeden konkretny) wiersz, ale wykluczył wszystkie kolumny z wyniku, które miały wartość null - ta odpowiedź wymaga albo określenia, które kolumny nie mogą mieć wartości null (co jest zupełnie innym problemem) lub wyszczególnij wszystkie kolumny, nieodpowiednie dla tabel z wieloma kolumnami
csey
(np. coś podobnego do SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey
18

Możesz odfiltrować wiersze zawierające wartość NULL w określonej kolumnie:

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

Jeśli chcesz odfiltrować wiersze zawierające null w dowolnej kolumnie, spróbuj tego:

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

Aktualizacja: na podstawie twoich komentarzy, może tego chcesz?

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

Zgadzam się z Martinem, że jeśli musisz to zrobić, prawdopodobnie powinieneś zmienić projekt bazy danych.

Mark Byers
źródło
Nie jestem pewien, czy wyjaśniłem to wystarczająco dobrze, ale spróbuję trochę lepiej. W tej chwili, gdy wybiorę *, otrzymuję wartości val1, val2, val3, null, val4, val5, null, null itp., Ale chcę tylko uzyskać wartości, które nie są równe null w moim wyniku. Czy jest to możliwe bez filtrowania za pomocą pętli?
bryan sammon
@bryan - Czy możesz wyjaśnić, które kolumny *zwracają? Może podaj przykładowe dane w swoim pytaniu, ponieważ z powyższego komentarza nie wynika, czy to wszystko jedna kolumna.
Martin Smith,
W tej chwili * zwraca wszystkie moje wartości z rzędu. tj. val1, val2, val3, null, val4, val5, null, null. Ale chcę, aby zwracało tylko wartości kolumn, które nie są zerowe. W tej chwili robię to za pomocą pętli, aby odfiltrować wartości po zwróceniu wyniku.
bryan sammon
13
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

Jedyną wadą tego podejścia jest to, że można porównać tylko 5 kolumn, po czym wynik zawsze będzie fałszywy, więc porównuję tylko te pola, które mogą być NULL.

Alan Chavez
źródło
8

Znalazłem to rozwiązanie:

To zapytanie wybiera ostatnią wartość inną niż null dla każdej kolumny.

Przykład


Jeśli masz stolik:

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

dostajesz:

title|body
t3   |b2

Pytanie


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

Mam nadzieję, że ci pomogę.

porquero
źródło
GROUP_CONCAT (body) AS body
Ravindra Singh
2

Korzystam z \!polecenia w MySQL, aby wyodrębnić wartości NULL z powłoki:

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

Działa najlepiej z poprawnym, .my.cnfgdzie podano bazę danych / nazwę użytkownika / hasło. W ten sposób po prostu trzeba otoczyć selectz \! mysql ei | grep -v NULL.

trzęsienie duszy
źródło
1

Następujące zapytanie działa dla mnie

kiedy ustawię domyślną wartość kolumny „NULL”, to

select * from table where column IS NOT NULL

a kiedy ustawię wartość domyślną, nic

select * from table where column <>''
Basant
źródło
0

Tak, użyj NOT NULLw swoim zapytaniu jak poniżej.

SELECT * 
FROM table
WHERE col IS NOT NULL;
Jonathan Vasiliou
źródło
0

MYSQL NIE JEST NULL Z POŁĄCZENIAMI I WYBIERANIE, WSTAWIANIE DO, USUWANIE I OPERATOR LOGICZNY JAK LUB NIE

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;
Deweloper
źródło
-4
SELECT * FROM TABLE_NAME
where COLUMN_NAME <> '';
Venkat Kallem
źródło
2
Nie zaznaczaj, które są puste. pytanie dotyczy wyboru wartości innych niż null
krishna,