Как условно обрабатывать деление на ноль с помощью 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;