Как условно обрабатывать деление на ноль с MySQL - PullRequest
20 голосов
/ 23 ноября 2011

В MySQL этот запрос может выдать ошибку деления на ноль:

SELECT ROUND(noOfBoys / noOfGirls) AS ration
FROM student;

Если noOfGirls равно 0, тогда вычисление не будет выполнено.

Каков наилучший способсправиться с этим?

Я бы хотел условно изменить значение noOfGirls на 1, когда оно равно 0.

Есть ли лучший способ?

Ответы [ 6 ]

15 голосов
/ 23 ноября 2011

Да, вы можете сделать случай:

select case when noOfGirls=0 then noOfBoys 
       else  round(noOfBoys/noOfGirls) end as ration 
from student;

Но вы, вероятно, хотите:

select case when noOfGirls=0 then 1 
       else  round(noOfBoys/noOfGirls) end as ration 
from student;
11 голосов
/ 23 ноября 2011

Вы можете использовать этот (сверхэкспрессивный) способ:

select IF(noOfGirls=0, NULL, round(noOfBoys/noOfGirls)) as ration from student;

, который выдаст NULL, если нет девушек, что фактически равно 0/0 в семантике SQL.

MySQL в любом случае выдаст NULL, если вы попытаетесь сделать 0/0, поскольку SQL означает fo NULL как «нет данных», или в этом случае «я не знаю, что это значение может быть».

4 голосов

GREATEST(x, 1)

Может использоваться, поскольку число девочек должно быть положительным:

SELECT ROUND(noOfBoys / GREATEST(noOfGirls, 1)) AS ration FROM student;

Но оно не очень переносимо во всех реализациях SQL.

Документация: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_greatest

2 голосов
/ 23 ноября 2011

Хорошо, если вы хотите установить noOfGirls в 1, если это 0, тогда должно работать следующее:

SELECT ROUND(noOfBoys / if(noOfGirls, noOfGirls, 1)) as ration FROM student;
0 голосов
/ 08 октября 2015

проверьте, равен ли знаменатель нулю, а знаменатель не равен NULL - если да, тогда используйте 'NaN'.

0 голосов
/ 23 ноября 2011
select
    case student.noOfGirls
           when 0 then 1
           else  round(noOfBoys/noOfGirls)
    end as ration
from
    `student`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...