2011-11-23 9 views
15

In MySQL, questa query potrebbe gettare una divisione per zero:Come gestire condizionalmente divisione per zero con MySQL

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

Se noOfGirls è 0 quindi il calcolo non riesce.

Qual è il modo migliore per gestire questo?

Desidero modificare in modo condizionale il valore di noOfGirls a 1 quando è uguale a 0.

C'è un modo migliore?

+5

MySQL non genera errori di divisione per zero. –

+2

@UncleIroh Dipende dalla configurazione di MySQL. Se il server MySQL ha la modalità 'ERROR_FOR_DIVISION_BY_ZERO' abilitata, emetterà un errore quando si verifica una divisione per zero. – Metafaniel

+0

@Metafaniel Interessante non lo sapevo. Grazie. –

risposta

11

Sì, si può fare un caso:

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

Ma probabilmente si desidera:

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

È possibile utilizzare questo modo (over-espressiva):

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

Quale uscirà NULL se non ci sono ragazze, che è effettivamente quello che dovrebbe essere 0/0 nella semantica SQL.

MySQL comunque dare NULL se si tenta di fare 0/0, come il significato SQL fo NULL è "nessun dato", o in questo caso "non so che cosa questo valore può essere".

2

Beh, se si desidera impostare noOfGirls a 1 se è 0, quindi il seguente dovrebbe funzionare:

SELECT ROUND(noOfBoys/if(noOfGirls, noOfGirls, 1)) as ration FROM student; 
0
select 
    case student.noOfGirls 
      when 0 then 1 
      else round(noOfBoys/noOfGirls) 
    end as ration 
from 
    `student` 
3

GREATEST(x, 1) può essere utilizzato in quanto il numero di ragazze deve essere positivo:

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

Ma non è molto portabile su tutte le implementazioni SQL.

0

controllare se il denominatore è zero e il nominator non è NULL - se sì, utilizzare "NaN".

Problemi correlati