Vấn đề:
Bạn muốn thực hiện phép chia trong truy vấn SQL của mình, nhưng mẫu số là một biểu thức có thể bằng không. Cơ sở dữ liệu sẽ cung cấp cho bạn một lỗi khi mẫu số trên thực tế là 0.
Ví dụ:
Cơ sở dữ liệu của chúng tôi có một bảng có tên investor_data
với dữ liệu trong các cột sau:id
, investor_year
, price_per_share
, income
và expenses
.
id | Investor_year | price_per_share | thu nhập | chi phí |
---|---|---|---|---|
1 | 2016 | 20 | 3200 | 2300 |
2 | 2017 | 130 | 2000 | 2000 |
3 | 2018 | 40 | 200 | 100 |
4 | 2019 | 15 | 5900 | 4900 |
Hãy lấy giá mỗi cổ phiếu chia cho chênh lệch giữa thu nhập và chi phí để xác định tỷ lệ P / E (tỷ lệ giá trên thu nhập) cho mỗi năm. Lưu ý rằng có những trường hợp khi thu nhập bằng với chi phí, do đó sự khác biệt của chúng sẽ bằng không. Vì vậy, chúng ta cần phải tìm cách để tránh chia hết cho số không.
Giải pháp:
SELECT investor_year, price_per_share/NULLIF(income-expenses, 0) AS P_E_ratio FROM investor data;
Truy vấn này trả về tỷ lệ P / E cho mỗi năm như được mô tả trong báo cáo vấn đề:
Investor_year | P_E_ratio |
---|---|
2016 | 0,0222 |
2017 | NULL |
2018 | 0,4000 |
2019 | 0,0150 |
Nếu chênh lệch giữa thu nhập và chi phí bằng 0 (như trường hợp năm 2017), thì NULLIF
hàm thay đổi giá trị 0 thành giá trị NULL. Do đó, phép chia cho 0 sẽ cho bạn kết quả là NULL.
Thảo luận:
Nếu bạn muốn xử lý phép chia cho 0 một cách linh hoạt, bạn có thể sử dụng NULLIF
hàm số. NULLIF
nhận hai đối số:biểu thức quan tâm và giá trị bạn muốn ghi đè. Nếu đối số đầu tiên bằng đối số thứ hai thì NULLIF
trả về NULL; nếu không, nó trả về đối số đầu tiên.
Bạn có thể sử dụng hàm này để xử lý một phép chia tiềm năng cho 0 bằng cách bao bọc mẫu số trong một lệnh gọi đến NULLIF
. Trong ví dụ của chúng tôi, nếu chênh lệch giữa thu nhập và chi phí bằng 0, giá trị này sẽ được đổi thành NULL và mẫu số trong phép chia sẽ là NULL, không phải bằng không.
Giải pháp 2:Sử dụng WHERE
Tất nhiên, trong một số tình huống, bạn có thể sử dụng một giải pháp đơn giản hơn:Chỉ cần tránh chia cho 0 bằng cách sử dụng WHERE
với toán tử so sánh <>. Trong ví dụ của chúng tôi, chúng tôi có thể kiểm tra xem thu nhập-chi phí có khác 0. Nếu đúng, phép tính sẽ được trả về.
SELECT investor_year, price_per_share/(income-expenses) AS P_E_ratio FROM investor data WHERE (income-expenses) <> 0 ;
Lưu ý rằng với WHERE
giải pháp, bạn sẽ nhận được ít hàng hơn có trong investor_date
bàn. Các hàng có thu nhập và chi phí bằng nhau sẽ không được hiển thị trong kết quả cuối cùng.