Как условно обрабатывать деление на ноль с помощью MySQL

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

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

Если noOfGirls - 0, то вычисление не выполняется.

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

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

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

Ответы

Ответ 1

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

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;

Ответ 2

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

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

Что будет выдавать NULL, если нет девушек, что эффективно, что 0/0 должно быть в семантике SQL.

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

Ответ 3

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

Ответ 4

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

SELECT ROUND(noOfBoys / if(noOfGirls, noOfGirls, 1)) as ration FROM student;

Ответ 5

select
    case student.noOfGirls
           when 0 then 1
           else  round(noOfBoys/noOfGirls)
    end as ration
from
    `student`

Ответ 6

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

Ответ 7

Деление на NULL фактически работает на сервере MySQL и возвращает NULL. Так что вы можете сделать:

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

Я думаю, что соотношение NULL является наиболее точным для этого случая. Если вам нужно, чтобы отношение было равно numOfBoys, вы можете использовать:

SELECT COALESCE(ROUND(noOfBoys / NULLIF(noOfGirls, 0)), noOfBoys) AS ration FROM student;