mysql - 许多列上的 Sql 不为空
问题描述
我有很多带有 LEFT JOIN 的表,但最后我只想输出那些不为空的表,我可以让它像
WHERE Country IS NOT NULL AND City IS NOT NULL AND Address IS NOT NULL
等等,但这是获取我所有 SELECTED 表的最快方法吗?国家、城市、地址不为空不起作用。
解决方案
一个主意:
检查列值是否为空,然后给它一个整数值,然后将其相加;如果加法结果不是“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()
结果也会变为。您也可以使用以下过滤器进行过滤:NULL
NULL
HAVING
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
因此它可能不会比您已有的短。
推荐阅读
- python - 如何返回终端?
- android - 不需要的 textview 的位图轮廓
- wordpress - Woocommerce Webhook 和 Google Sheet API 的错误?
- r - 在 R 和 Python 中拆分数据框
- apache-flink - Apache Flink SQL:表属性参考指南
- html - 如何使导航选项卡在引导程序 3 中水平滚动?
- azure - 无法使用 AKS 私有负载均衡器注释 Kong 入口控制器
- php - 如何在 vue 的 stancl/tenancy 中使用 api 路由
- angular - 在 Angular / Karma 中测试时未加载 iframe 内容
- php - VSCode 中的任何 PHP 调试配置示例?