¿Es posible hacer una sentencia select que sólo tome valores NOT NULL?
Ahora mismo estoy usando esto:
SELECT * FROM table
Y luego tengo que filtrar los valores nulos con un bucle php.
Hay una manera de hacer:
SELECT * (that are NOT NULL) FROM table
?
Ahora mismo cuando selecciono * obtengo val1,val2,val3,null,val4,val5,null,null etc.... pero solo quiero obtener los valores que no son null en mi resultado. ¿Es esto posible sin filtrar con un bucle?
Debe utilizar IS NOT NULL
. (Los operadores de comparación =
y <>
dan ambos UNKNOWN
con NULL
a cada lado de la expresión).
SELECT *
FROM table
WHERE YourColumn IS NOT NULL;
Sólo para completar mencionaré que en MySQL también se puede negar el operador de igualdad seguro de null pero esto no es SQL estándar.
SELECT *
FROM table
WHERE NOT (YourColumn <=> NULL);
Editado para reflejar los comentarios. Parece que tu tabla no está en primera forma normal, en cuyo caso cambiar la estructura puede facilitarte la tarea. Un par de otras formas de hacerlo sin embargo...
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*/
La desventaja de lo anterior es que escanea la tabla varias veces, una por cada columna. Esto puede ser evitado por lo siguiente, pero no he probado esto en 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*/
Puede filtrar las filas que contienen un valor NULL en una columna específica:
SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL
Si desea filtrar las filas que contienen un valor nulo en cualquier columna, intente lo siguiente:
SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL
Actualización: En base a sus comentarios, ¿quizás quiera esto?
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
Y estoy de acuerdo con Martin en que si necesitas hacer esto entonces probablemente deberías cambiar el diseño de tu base de datos.
Select * from your_table
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;
La única desventaja de este enfoque es que sólo se pueden comparar 5 columnas, después el resultado siempre será falso, por lo que yo comparo sólo los campos que pueden ser NULL
.