簡體   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