Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Cách xử lý số chia cho số 0 trong SQL

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 , incomeexpenses .

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bất ngờ về hiệu suất và giả định:BẬT SỐ KHOẢN

  2. Kết nối được nhóm:Sắp xếp và loại bỏ các bản sao

  3. Tra cứu bảng trong công việc IRI tương thích với sắp xếpCL

  4. Cách di chuyển cơ sở dữ liệu vào máy chủ người bán lại của bạn

  5. Kiểm tra các tuyên bố DML cho OLTP trong bộ nhớ