MySQL SELECT solo no valores nulos


264

¿Es posible hacer una declaración select que solo tome valores NOT NULL?

En este momento estoy usando esto:

SELECT * FROM table

Y luego tengo que filtrar los valores nulos con un bucle php.

¿Hay alguna manera de hacerlo?

SELECT * (that are NOT NULL) FROM table

?

En este momento, cuando selecciono *, obtengo val1, val2, val3, nulo, val4, val5, nulo, nulo, etc ... pero solo quiero obtener los valores que no son nulos en mi resultado. ¿Es esto posible sin filtrar con un bucle?


2
¿Qué desea que suceda si hay una fila donde algunas columnas tienen valores NULL y otras columnas no tienen valores NULL?
Mark Byers

Me gustaría obtener solo los valores de las columnas que no son nulos, y devolver solo los valores de columna en la fila que no son nulos. En este momento uso un bucle para filtrarlos, ¿es posible hacerlo sin un bucle?
bryan sammon

1
@bryan - ¿Cuál es la estructura de su tabla? ¿Todas las columnas tienen el mismo tipo de datos?
Martin Smith

1
@bryan - Entonces, ¿cómo sería tu conjunto de resultados ideal? ¿Un conjunto de resultados de una columna que contiene todos los valores no nulos? Si no edita su pregunta con datos de ejemplo y los resultados deseados sería útil ...
Martin Smith

2
@bryan: ¿Parece que su tabla puede tener grupos repetidos en las columnas? (Consulte el artículo de Wiki para obtener una explicación y una estructura alternativa sugerida si ese es el caso en.wikipedia.org/wiki/First_normal_form )
Martin Smith

Respuestas:


453

Debe utilizar IS NOT NULL. (Los operadores de comparación =y <>ambos dan UNKNOWNcon NULLa cada lado de la expresión).

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Solo para completar, mencionaré que en MySQL también puede negar el operador de igualdad segura nula, pero esto no es SQL estándar.

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

Editado para reflejar los comentarios. Parece que su tabla puede no estar en la primera forma normal, en cuyo caso cambiar la estructura puede facilitar su tarea. Sin embargo, hay un par de otras formas de hacerlo ...

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 vez para cada columna. Es posible que esto se pueda evitar a continuación, pero no lo he probado 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*/

2
Muchas gracias .. Ayudó :)
DfrDkn

En el último enfoque, usaste una CASEdeclaración, no una CASEfunción. Entonces, ¿no debería ser en END CASElugar de END en la SELECT CASE ...parte?
Istiaque Ahmed

Para las personas no tan expertas, ¿puede explicar la última solución? ¿La idx rom la primera SELECTviene de idxla segunda SELECT? ¿Qué CASEintenta lograr la declaración? ¿Qué hace el segundo en SELECTrealidad? Y estás haciendo una unión interna, no una unión cruzada, ¿verdad?
Istiaque Ahmed

No creo que esto responda la pregunta. Parecía que OP quería seleccionar (supongo que una fila específica) pero excluir todas las columnas de ese resultado que eran nulas; esta respuesta requiere que especifique qué columnas no pueden ser nulas (lo cual es un problema completamente diferente) o especificar todas las columnas, no apto para tablas con muchas columnas
csey

(por ejemplo, algo parecido a SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey

18

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 esto:

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

Actualización: Según tus comentarios, ¿quizás quieres 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 necesita hacer esto, entonces probablemente debería cambiar el diseño de su base de datos.


No estoy seguro si lo expliqué lo suficientemente bien, pero lo intentaré un poco mejor. En este momento, cuando selecciono * obtengo val1, val2, val3, nulo, val4, val5, nulo, nulo, etc ... pero solo quiero obtener los valores que no son nulos en mi resultado. ¿Es esto posible sin filtrar con un bucle?
bryan sammon

@ Bryan - ¿Podría explicar qué columnas *regresa? Tal vez proporcione un poco de datos de ejemplo en su pregunta, ya que no está claro en su comentario anterior si se trata de una columna.
Martin Smith

En este momento, * devuelve todos mis valores en la fila. es decir, val1, val2, val3, nulo, val4, val5, nulo, nulo. Pero quiero que solo devuelva los valores de columna que no son nulos. En este momento lo hago con un bucle para filtrar los valores después de que devuelve el resultado.
bryan sammon

13
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 solo puede comparar 5 columnas, después de eso el resultado siempre será falso, por lo que comparo solo los campos que pueden ser NULL.


8

Encontré esta solución:

Esta consulta selecciona el último valor no nulo para cada columna.

Ejemplo


Si tienes una mesa:

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

usted obtiene:

title|body
t3   |b2

Consulta


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

Espero ayudarte


GROUP_CONCAT (body) AS body
Ravindra Singh el

2

Uso el \!comando dentro de MySQL para extraer valores NULL del shell:

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

Funciona mejor con un apropiado .my.cnfdonde se especifique su base de datos / nombre de usuario / contraseña. De esa manera usted solo tiene que rodear el selectcon \! mysql ey | grep -v NULL.


1

La siguiente consulta me funciona

cuando configuré el valor predeterminado de la columna 'NULL'

select * from table where column IS NOT NULL

y cuando he establecido el valor predeterminado nada, entonces

select * from table where column <>''

0

Sí, use NOT NULLen su consulta como esta a continuación.

SELECT * 
FROM table
WHERE col IS NOT NULL;


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

2
Esto no es seleccionar cuáles están vacías. pregunta es para seleccionar valores no nulos
krishna
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.