È possibile fare una dichiarazione di selezione che prende solo valori NOT NULL?
In questo momento sto usando questo:
SELECT * FROM table
E poi devo filtrare i valori nulli 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 i valori che non sono nulli nel mio risultato. È possibile farlo senza filtrare con un ciclo?
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 dirò che in MySQL si può anche negare l'operatore di uguaglianza null safe equality operator ma questo non è SQL standard.
SELECT *
FROM table
WHERE NOT (YourColumn <=> NULL);
Modificato per riflettere i commenti. Sembra che la tua tabella non sia in prima forma normale, nel qual caso cambiare la struttura può rendere il tuo compito più facile. 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 scansiona la tabella più volte, una volta per ogni colonna. Questo potrebbe essere evitato con il metodo seguente, ma non l'ho testato 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 vostri commenti, forse volete questo?
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 che se hai bisogno di fare questo, allora probabilmente dovresti cambiare il design 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 io confronto solo i campi che possono essere NULL
.