首页 > 解决方案 > 许多列上的 Sql 不为空

问题描述

我有很多带有 LEFT JOIN 的表,但最后我只想输出那些不为空的表,我可以让它像

WHERE Country IS NOT NULL AND City IS NOT NULL AND Address IS NOT NULL

等等,但这是获取我所有 SELECTED 表的最快方法吗?国家、城市、地址不为空不起作用。

标签: mysql

解决方案


一个主意:

检查列值是否为空,然后给它一个整数值,然后将其相加;如果加法结果不是“0”(假设所有列主要包含带有数字等的字母)。就像是:

SELECT country, city, address, 
       IFNULL(country,1)+IFNULL(city,1)+IFNULL(address,1) AS checking
FROM test;

returns:
+---------+------+---------+----------+
| country | city | address | checking |
+---------+------+---------+----------+
|    A    |  A   |    A    |    0     |
|    B    |  B   |    B    |    0     |
|  NULL   | NULL |   NULL  |    3     |
|    C    |  C   |    C    |    0     |
+---------+------+---------+----------+

然后,您可以添加HAVING如下内容:

SELECT country, city, address, 
       IFNULL(country,1)+IFNULL(city,1)+IFNULL(address,1) AS checking
FROM test
HAVING checking=0;

如果您要比较的所有列不只是数字,这可能会很好。

另一个想法是使用SUM(col+col+col...)如下:

SELECT country, city, address, SUM(country + city + address) AS checking 
FROM test
GROUP BY country, city, address;

returns:
+---------+------+---------+----------+
| country | city | address | checking |
+---------+------+---------+----------+
|    A    |  A   |    A    |    0     |
|    B    |  B   |    B    |    0     |
|  NULL   | NULL |   NULL  |   NULL   |
|    C    |  C   |    C    |    0     |
|    D    |  D   |    1    |    1     |
|    E    |  E   |   NULL  |   NULL   |
+---------+------+---------+----------+

如您所见,如果操作中的一列有值,即使其他列都是数字,SUM()结果也会变为。您也可以使用以下过滤器进行过滤:NULLNULLHAVING

SELECT country, city, address, SUM(country + city + address) AS checking 
FROM test
GROUP BY country, city, address
HAVING checking IS NOT NULL;

这将至少涵盖其中一列是否有数字,但是将要求您在GROUP BY到期时列出所有非聚合列,sql_mode=only_full_group_by因此它可能不会比您已有的短。

这是一个 db<>fiddle 演示


推荐阅读