繁体   English   中英

MySQL> 添加整数和 null 值

[英]MySQL> Adding integers and null values

问题:我们如何正确处理至少一个操作数是 NULL 的表的不同列的算术运算?


背景:我们有一些从公共领域挖掘出来的数据,并导入到 MySQL。 有一些文本字段和一些 integer 字段。 数据挖掘器将所有缺失的字段视为 NULL,而不是将值 0 分配给缺失的 integer 字段,并将 NULL 分配给缺失的文本字段。

我可以用这个简单的表定义重新创建我们的问题:

CREATE TABLE employee
(
    id     INT AUTO_INCREMENT,
    name   VARCHAR(40),
    salary INT,
    bonus  INT,
    
    PRIMARY KEY(id)
);  

我正在按如下方式填充此示例表

INSERT INTO employee(name, salary, bonus)
VALUES('Keith', 120000, 10000), ('Larson', 110000, 8000),
('Angelina', 125000, 12500), ('Will', 75000, null),
('Mary', 80000, null), ('Steve', null, null), ('John', null, null);

查询

SELECT * FROM employee;

产量

+----+----------+--------+-------+
| id | name     | salary | bonus |
+----+----------+--------+-------+
|  1 | Keith    | 120000 | 10000 |
|  2 | Larson   | 110000 |  8000 |
|  3 | Angelina | 125000 | 12500 |
|  4 | Will     |  75000 |  NULL |
|  5 | Mary     |  80000 |  NULL |
|  6 | Steve    |   NULL |  NULL |
|  7 | John     |   NULL |  NULL |
+----+----------+--------+-------+

对于算术运算,列中的 NULL 值被视为 0。 这就是为什么

SELECT SUM(salary) FROM employee;

产量

+-------------+
| SUM(salary) |
+-------------+
|      510000 |
+-------------+

但是,当跨列执行算术运算,并且至少有一个操作数是 NULL 时,返回的值是 NULL。 例如:

SELECT name, (salary + bonus) FROM employee;

产量

+----------+------------------+
| name     | (salary + bonus) |
+----------+------------------+
| Keith    |           130000 |
| Larson   |           118000 |
| Angelina |           137500 |
| Will     |             NULL |
| Mary     |             NULL |
| Steve    |             NULL |
| John     |             NULL |
+----------+------------------+  

我希望我的查询为 Will 返回 75000,为 Mary 返回 80000(除了 Keith、Larson 和 Angelina 的正确值之外)。

使用coalesce 这是演示

SELECT 
    name, 
    (salary + coalesce(bonus, 0)) as total
FROM employee;

output:

| name     | total  |
| -------- | ------ |
| Keith    | 130000 |
| Larson   | 118000 |
| Angelina | 137500 |
| Will     | 75000  |
| Mary     | 80000  |
| Steve    | null   |
| John     | null   |

为了安全起见,您可以使用(coalesce(salary, 0) + coalesce(bonus, 0)) ,因此您的结果不会显示null

您可以使用 IFNULL。

SELECT 
name, 
salary + IFNULL(bonus, 0) as total
FROM employee;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM