MySQL只select非空值

是否有可能做一个只有NOT NULL值的select语句?

现在我正在使用这个:

SELECT * FROM table 

然后我必须用php循环过滤出空值。

有没有办法做到这一点:

 SELECT * (that are NOT NULL) FROM table 

现在,当我select*我得到了val1,val2,val3,null,val4,val5,null,null等….但我只想得到在结果中不为空的值。 这可能没有循环过滤?

你应该使用IS NOT NULL 。 (比较运算符=<>在expression式的任一侧都给出了UNKNOWN

 SELECT * FROM table WHERE YourColumn IS NOT NULL; 

为了完整性,我会提到在MySQL中,你也可以否定null安全等号运算符,但这不是标准的SQL。

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

编辑以反映评论。 这听起来像你的表可能不是在第一个正常的forms,在这种情况下,更改结构可能会使您的任务更容易。 还有一些其他的方式,虽然…

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

以上的缺点是它为每一列多次扫描一次表格。 这可能可以通过下面来避免,但我没有在MySQL中testing过。

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

您可以筛选出在特定列中包含NULL值的行:

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

如果你想过滤掉任何列中包含null的行,试试这个:

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

更新:根据你的意见,也许你想这个?

 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 

我和Martin一起讨论如果你需要这样做,那么你应该改变你的数据库devise。

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

这种方法的唯一缺点是你只能比较5列,然后结果总是假的,所以我只比较可以为NULL的字段。

我发现这个解决scheme:

此查询为每列select最后一个非空值。


如果你有一张桌子:

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

你得到:

 title|body t3 |b2 

询问


 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 

我希望能帮助你。

我使用\! 命令在MySQL中从shell中删除NULL值:

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

它最适合使用.my.cnf指定您的数据库/用户名/密码。 这样,你只需要围绕你的select \! mysql e \! mysql e| grep -v NULL | grep -v NULL

是的,在你的查询中使用NOT NULL如下所示。

 SELECT * FROM table WHERE col IS NOT NULL; 
 SELECT * FROM TABLE_NAME where COLUMN_NAME <> '';