MySQL SELECT non solo valori nulli


264

È possibile fare un'istruzione select che accetta solo valori NOT NULL?

In questo momento sto usando questo:

SELECT * FROM table

E poi devo filtrare i valori null con un ciclo php.

C'è un modo per fare:

SELECT * (that are NOT NULL) FROM table

?

In questo momento quando seleziono * Ottengo val1, val2, val3, null, val4, val5, null, null ecc .... ma voglio solo ottenere valori che non sono nulli nel mio risultato. È possibile senza filtrare con un loop?


2
Cosa vuoi che accada se esiste una riga in cui alcune colonne hanno valori NULL e altre colonne non hanno valori NULL?
Mark Byers,

Vorrei ottenere solo i valori dalle colonne che non sono null e restituire solo i valori delle colonne nella riga che non sono null. In questo momento uso un loop per filtrarli, è possibile farlo senza un loop?
Bryan Sammon,

1
@bryan - Qual è la struttura del tuo tavolo? Tutte le colonne hanno lo stesso tipo di dati?
Martin Smith,

1
@bryan - Quindi quale sarebbe il tuo set di risultati ideale allora? Un set di risultati a una colonna contenente tutti i valori non nulli? Se non modificare la tua domanda con i dati di esempio e i risultati desiderati sarebbe utile ...
Martin Smith,

2
@bryan - Sembra che la tua tabella possa avere gruppi ripetuti tra le colonne? (Vedi l'articolo Wiki per una spiegazione e una struttura alternativa suggerita se è il caso en.wikipedia.org/wiki/First_normal_form )
Martin Smith,

Risposte:


453

Si dovrebbe usare IS NOT NULL. (Gli operatori di confronto =e <>sia dare UNKNOWNcon NULLai lati dell'espressione.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Solo per completezza, menzionerò che in MySQL è anche possibile annullare l' operatore null safe uguaglianza, ma questo non è SQL standard.

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

Modificato per riflettere i commenti. Sembra che il tuo tavolo potrebbe non essere nella prima forma normale, nel qual caso cambiare la struttura potrebbe semplificare il tuo compito. Un paio di altri modi per farlo però ...

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

Lo svantaggio di quanto sopra è che esegue la scansione della tabella più volte una volta per ogni colonna. Ciò potrebbe essere evitato dal seguito, ma non l'ho provato su 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
Grazie mille .. Mi ha aiutato :)
DfrDkn

Nell'ultimo approccio, hai usato CASEistruzione, non CASEfunzione. Quindi non dovrebbe essere END CASEinvece che END nella SELECT CASE ...parte?
Istiaque Ahmed,

Per persone non così esperte, puoi spiegare l'ultima soluzione? La idx rom la prima SELECTproviene dalla idxseconda SELECT? Cosa CASEcerca di realizzare l' affermazione? Cosa fa SELECTeffettivamente il secondo ? E stai facendo un join interno, non un cross join, giusto?
Istiaque Ahmed,

Non credo che questo risponda alla domanda. Sembrava che OP volesse selezionare (presumo una specifica) riga ma escludere tutte le colonne da quel risultato che erano nulle - questa risposta richiede di specificare quali colonne non possono essere nulle (che è un problema completamente diverso) o specifica tutte le colonne, non adatto a tabelle con molte colonne
csey

(es. qualcosa del genere SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey

18

Puoi filtrare le righe che contengono un valore NULL in una colonna specifica:

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

Se vuoi filtrare le righe che contengono un null in qualsiasi colonna, prova questo:

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

Aggiornamento: in base ai tuoi commenti, forse lo vuoi?

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

E sono d'accordo con Martin sul fatto che, se è necessario, è necessario modificare il design del database.


Non sono sicuro di averlo spiegato abbastanza bene, ma proverò un po 'meglio. In questo momento quando seleziono * Ottengo val1, val2, val3, null, val4, val5, null, null ecc .... ma voglio solo ottenere valori che non sono nulli nel mio risultato. È possibile senza filtrare con un loop?
Bryan Sammon,

@bryan - Potresti spiegare quali colonne *restituiscono? Forse fornisci un po 'di dati di esempio nella tua domanda in quanto non è chiaro dal tuo commento sopra se questa è tutta una colonna.
Martin Smith,

In questo momento, * restituisce tutti i miei valori nella riga. vale a dire val1, val2, val3, null, val4, val5, null, null. Ma voglio che restituisca solo i valori di colonna che non sono nulli. In questo momento lo faccio con un ciclo per filtrare i valori dopo che restituisce il risultato.
Bryan Sammon,

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

L'unico svantaggio di questo approccio è che puoi confrontare solo 5 colonne, dopodiché il risultato sarà sempre falso, quindi confronto solo i campi che possono essere NULL.


8

Ho trovato questa soluzione:

Questa query seleziona l'ultimo valore non nullo per ogni colonna.

Esempio


Se hai un tavolo:

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

ottieni:

title|body
t3   |b2

domanda


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

Spero di aiutarti.


GROUP_CONCAT (body) AS body
Ravindra Singh,

2

Uso il \!comando all'interno di MySQL per estrarre i valori NULL dalla shell:

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

Funziona meglio con una corretta .my.cnfdove sono specificati il ​​tuo database / nome utente / password. In questo modo si hanno solo per circondare il vostro selectcon \! mysql ee | grep -v NULL.


1

A seguito di una query che funziona per me

quando ho impostato il valore predefinito della colonna 'NULL' allora

select * from table where column IS NOT NULL

e quando non ho impostato il valore predefinito niente allora

select * from table where column <>''

0

Sì, utilizzare NOT NULLnella query in questo modo di seguito.

SELECT * 
FROM table
WHERE col IS NOT NULL;

0

MYSQL NON È NULLA CON JOIN E SELEZIONA, INSERISCI, ELIMINA E OPERATORE LOGICO COME O, ​​NON

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;

-4
SELECT * FROM TABLE_NAME
where COLUMN_NAME <> '';

2
Questo non è selezionare quali sono vuoti. domanda è per selezionare valori non nulli
Krishna,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.