Vấn đề:
Bạn muốn tránh lỗi chia cho không.
Ví dụ:
Cơ sở dữ liệu của chúng tôi có một bảng có tên là numbers
với dữ liệu trong các cột id
, number_a
và number_b
.
id | number_a | number_b |
---|---|---|
1 | 4 | 0 |
2 | 57 | -5 |
3 | -7 | 56 |
4 | -67 | 0 |
5 | 23 | 55 |
6 | -8 | -4 |
Hãy chia number_a
bởi number_b
và hiển thị bảng với một cột mới, divided
, với kết quả của phép chia.
Giải pháp 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Giải pháp 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
Kết quả là:
id | number_a | number_b | chia |
---|---|---|---|
1 | 4 | 0 | KHÔNG ĐẦY ĐỦ |
2 | 57 | -5 | -11.4000 |
3 | -7 | 56 | -0,1250 |
4 | -67 | 0 | KHÔNG ĐẦY ĐỦ |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2.0000 |
Giải pháp 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
Kết quả là:
id | number_a | number_b | chia |
---|---|---|---|
2 | 57 | -5 | -11.4000 |
3 | -7 | 56 | -0,1250 |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2.0000 |
Thảo luận:
Giải pháp đầu tiên sử dụng NULLIF()
hàm, nhận hai số làm đối số. Khi đối số đầu tiên bằng đối số khác, hàm trả về NULL
kết quả là. Nếu number_b
bằng 0, ước số là NULL
và kết quả của phép chia là NULL
.
Giải pháp thứ hai sử dụng CASE
tuyên bố. Nếu điều kiện sau WHEN
từ khóa là đúng (trong trường hợp của chúng tôi, điều kiện là number_b = 0
), chúng tôi chỉ định rằng NULL được trả về. Nếu không, việc phân chia diễn ra như bình thường.
Giải pháp thứ ba chỉ cần sử dụng WHERE
điều kiện để lọc ra các hàng có number_b
là số không. Các hàng có number_b
bằng 0 bị thiếu trong tập kết quả.