MySQL SELECT apenas valores não nulos

É possível fazer uma instrução select que leva apenas valores NOT NULL?

Agora estou usando isso:

SELECT * FROM table 

E então eu tenho que filtrar os valores nulos com um loop php.

Existe uma maneira de fazer:

 SELECT * (that are NOT NULL) FROM table 

?

Agora, quando eu seleciono * Eu recebo val1, val2, val3, nulo, val4, val5, nulo, nulo, etc …. mas eu só quero obter os valores que não são nulos no meu resultado. Isso é possível sem filtrar com um loop?

Você deve usar IS NOT NULL . (Os operadores de comparação = e <> ambos fornecem UNKNOWN com NULL em ambos os lados da expressão.)

 SELECT * FROM table WHERE YourColumn IS NOT NULL; 

Apenas por completude vou mencionar que no MySQL você também pode negar o operador de igualdade segura nulo mas isto não é SQL padrão.

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

Editado para refletir comentários. Parece que sua mesa pode não estar na primeira forma normal, caso em que alterar a estrutura pode facilitar sua tarefa. Algumas outras maneiras de fazer isso …

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

A desvantagem do acima é que ele varre a tabela várias vezes uma vez para cada coluna. Isso pode ser evitado pelo abaixo, mas eu não testei isso no 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*/ 

Você pode filtrar linhas que contenham um valor NULL em uma coluna específica:

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

Se você quiser filtrar linhas que contenham um nulo em qualquer coluna, tente isto:

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

Atualização: Com base nos seus comentários, talvez você queira isso?

 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 eu concordo com Martin que, se você precisar fazer isso, provavelmente deve mudar o design do seu database.

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

A única desvantagem desta abordagem é que você só pode comparar 5 colunas, depois disso o resultado será sempre falso, então eu comparo apenas os campos que podem ser NULL .

Eu encontrei esta solução:

Esta consulta seleciona o último valor não nulo para cada coluna.

Exemplo


Se você tem uma mesa:

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

você recebe:

 title|body t3 |b2 

Inquerir


 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 te ajudar.

Eu uso o \! comando dentro do MySQL para extrair valores NULL do shell:

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

Funciona melhor com um .my.cnf adequado, onde seu database / nome de usuário / senha são especificados. Dessa forma, você só tem que cercar sua select com \! mysql e \! mysql e e | grep -v NULL | grep -v NULL .

Sim, use NOT NULL em sua consulta como esta abaixo.

 SELECT * FROM table WHERE col IS NOT NULL; 

Seguinte consulta trabalhando para mim

quando eu tiver definido o valor padrão da coluna ‘NULL’ então

 select * from table where column IS NOT NULL 

e quando eu definir o valor padrão nada, então

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