MySQL SELECT solo valori non nulli

È ansible eseguire un’istruzione select che accetta solo valori NOT NULL?

In questo momento sto usando questo:

SELECT * FROM table 

E poi devo filtrare i valori nulli con un loop php.

C’è un modo per fare:

 SELECT * (that are NOT NULL) FROM table 

?

Proprio ora quando seleziono * Ricevo val1, val2, val3, null, val4, val5, null, null ecc …. ma voglio solo ottenere i valori che non sono nulli nel mio risultato. È ansible senza filtrare con un loop?

Dovresti usare IS NOT NULL . (Gli operatori di confronto = e <> entrambi danno UNKNOWN con NULL su entrambi i lati dell’espressione.)

 SELECT * FROM table WHERE YourColumn IS NOT NULL; 

Solo per completezza, menzionerò che in MySQL è ansible anche negare l’ operatore di uguaglianza nullo ma questo non è SQL standard.

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

Modificato per riflettere i commenti. Sembra che il tuo tavolo non sia nella sua forma normale, nel qual caso cambiare la struttura potrebbe rendere più semplice il tuo compito. Un paio di altri modi per farlo anche se …

 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 del tavolo più volte una volta per ogni colonna. Quello potrebbe essere evitato dal sotto ma non ho provato questo in 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*/ 

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 hai bisogno di farlo, probabilmente dovresti cambiare la progettazione del tuo database.

 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, dopo di che il risultato sarà sempre falso, quindi confronto solo i campi che possono essere NULL .

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.

Io uso il \! comando in MySQL per annullare i valori NULL dalla shell:

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

Funziona meglio con un proprio .my.cnf dove sono specificati il ​​tuo database / nome utente / password. In questo modo devi solo circondare la select con \! mysql e \! mysql e e | grep -v NULL | grep -v NULL .

Si usa NOT NULL nella tua query come questa di seguito.

 SELECT * FROM table WHERE col IS NOT NULL; 

Segue 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 ho impostato il valore predefinito nulla allora

 select * from table where column <>'' 
 SELECT * FROM TABLE_NAME where COLUMN_NAME <> '';