Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Ошибки деления на нуль

Сравнение левосторонних и правосторонних внешних соединений | Трехсторонние внешние соединения | Рекурсивные внешние соединения | Перекрестные соединения | Естественные соединения | Что такое условная логика? | Выражение case | Простые выражения case | Gt; FROM account | Селективная агрегация |


Читайте также:
  1. II. Основные принципы и ошибки инвестирования
  2. II. Решение задачи распределения ресурсов в EXCEL.
  3. II. Трудные случаи определения вводных слов.
  4. Lt;question>Какие ошибки являются фонетическими?
  5. А. Подразделения Библии и проблема канона
  6. Автоматический механизм отделения литника в литьевой форме для гильз
  7. Авторское вознаграждение. Порядок определения размера вознаграждения, порядок и сроки его выплаты

 

Проводя вычисления, включающие деление, нужно все время забо_ титься о том, чтобы знаменатель никогда не был равен нулю. Некото_ рые серверы БД, такие как Oracle Database, встретив нулевой знамена_ тель, формируют ошибку, а MySQL просто присваивает результату вы_ числения значение null, как показывает следующий пример:

 

mysql> SELECT 100 / 0;

 

+_________+ | 100 / 0 | +_________+ | NULL | +_________+

 

1 row in set (0.00 sec)

 

Чтобы защитить вычисления от ошибок или, еще хуже, от загадочного получения null, следует ко всем знаменателям применять условную логику, как показано далее:

 

mysql> SELECT a.cust_id, a.product_cd, a.avail_balance /

_>   CASE      
_>     WHEN prod_tots.tot_balance = 0 THEN 1
_>     ELSE prod_tots.tot_balance  
_>   END percent_of_total    
_> FROM account a INNER JOIN    
_> (SELECT a.product_cd, SUM(a.avail_balance) tot_balance
_>   FROM account a    
_>   GROUP BY a.product_cd) prod_tots  
_>   ON a.product_cd = prod_tots.product_cd;
+_________+____________+__________________+
| cust_id | product_cd | percent_of_total |
+_________+____________+__________________+
|   | BUS | 0.0000 |
|   | BUS | 1.0000 |
|   | CD | 0.1538 |
|   | CD | 0.5128 |
|   | CD | 0.2564 |
|   | CD | 0.0769 |
|   | CHK | 0.0145 |
|   | CHK | 0.0309 |
|   | CHK | 0.0145 |
|   | CHK | 0.0073 |
|   | CHK | 0.0307 |
|   | CHK | 0.0017 |

 

Примеры выражений case      
             
|   | CHK | 0.0478 |
|   | CHK | 0.0017 |
|   | CHK | 0.3229 |
|   | CHK | 0.5281 |
|   | MM | 0.1298 |
|   | MM | 0.3219 |
|   | MM | 0.5483 |
|   | SAV | 0.2694 |
|   | SAV | 0.1078 |
|   | SAV | 0.4137 |
|   | SAV | 0.2091 |
|   | SBL | 1.0000 |

 

+_________+____________+__________________+ 24 rows in set (0.00 sec)

 

Этот запрос вычисляет отношение остатка на счете к общему остатку для всех счетов одного типа. Поскольку для некоторых типов счетов, таких как ссуды коммерческим предприятиям, общий остаток может равняться нулю, если на текущий момент все ссуды полностью выпла_ чены, лучше всего включить выражение case, гарантирующее, что знаменатель никогда не будет равен нулю.

 


Дата добавления: 2015-08-17; просмотров: 41 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Проверка существования| Условные обновления

mybiblioteka.su - 2015-2024 год. (0.008 сек.)