Come evitare l'errore "divide per zero" in SQL?


363

Ho questo messaggio di errore:

Messaggio 8134, livello 16, stato 1, riga 1 Si è verificato un errore di divisione per zero.

Qual è il modo migliore per scrivere il codice SQL in modo che non vedrò mai più questo messaggio di errore?

Potrei fare una delle seguenti operazioni:

  • Aggiungi una clausola where in modo che il mio divisore non sia mai zero

O

  • Potrei aggiungere una dichiarazione del caso, in modo che ci sia un trattamento speciale per zero.

È il modo migliore di usare una NULLIFclausola?

Esiste un modo migliore o come può essere applicato?


7
Forse una certa convalida dei dati è in ordine.
Anthony,

Risposte:


645

Per evitare un errore "Divisione per zero" lo abbiamo programmato in questo modo:

Select Case when divisor=0 then null
Else dividend / divisor
End ,,,

Ma ecco un modo molto più bello di farlo:

Select dividend / NULLIF(divisor, 0) ...

Ora l'unico problema è ricordare il bit NullIf, se uso il tasto "/".


13
Un modo molto più semplice di farlo "Seleziona dividendo / annullamento (divisore, 0) ..." si interrompe se divisore è NULL.
Anderson,

8
@Anderson Non è affatto vero. Sei sicuro di non aver usato accidentalmente IsNullinvece di NullIf? Prova tu stesso! SELECT Value,1/NullIf(Value,0)FROM(VALUES(0),(5.0),(NULL))x(Value);A meno che per "interruzioni" intendi restituire un NULL? Puoi convertirlo in quello che vuoi con IsNullo Coalesce.
ErikE,

1
@ErikE, è vero ... prova a eseguire ... seleziona 1 / nullif (null, 0) ... ottieni "Il tipo del primo argomento di NULLIF non può essere la costante NULL perché il tipo del primo argomento ha essere conosciuto." Gestire questo utilizzando "coalesce (FieldName, 0)" ... ad es. Selezionare 1 / nullif (coalesce (null, 0), 0)
John Joseph,

1
@JohnJoseph Non so dire se sei d'accordo con me o litighi con me.
ErikE,

2
@JohnJoseph Guarda più da vicino l'errore che hai. Sì, SELECT 1 / NULLIF(NULL, 0)non riesce, ma è perché NULLIF()deve conoscere il tipo di dati del primo argomento. Questo esempio alterata funziona bene: SELECT 1 / NULLIF(CAST(NULL AS INT), 0). Nella vita reale, fornirai una colonna di tabella NULLIF()anziché una NULLcostante. Dal momento che le colonne della tabella hanno tipi di dati noti, questo funziona anche bene: SELECT 1 / NULLIF(SomeNullableColumn, 0) FROM SomeTable.
MarredCheese,

180

Nel caso in cui si desideri restituire zero, nel caso in cui si verifichi una devisione zero, è possibile utilizzare:

SELECT COALESCE(dividend / NULLIF(divisor,0), 0) FROM sometable

Per ogni divisore che è zero, otterrai uno zero nel set di risultati.


9
Alcuni benchmark rivelano che COALESCE è leggermente più lento di ISNULL. Tuttavia, COALESCE è conforme agli standard, quindi è più portatile.
Paul Chernoch,

37
Se qualcun altro non capisce immediatamente perché funziona, NULLIF (d, 0) restituirà NULL se d è 0. In SQL, la divisione per NULL restituisce NULL. Il Coalesce sostituisce il valore NULL risultante con 0.
GuiSim

16
@SQLGeorge Mentre sono d'accordo con il tuo argomento, tieni presente che ci sono casi in cui uno si preoccupa più di ciò che è statisticamente corretto che matematicamente corretto. In alcuni casi quando si utilizzano le funzioni statistiche, 0 o anche 1 è un risultato accettabile quando il divisore è zero.
Athafoud,

10
Qualcuno può spiegarmi perché questo è male? Se sto cercando di capire una percentuale e il divisore è zero, sicuramente voglio che il risultato sia zero.
Todd Sharp,

10
Penso che @George e @ James / Wilson fondamentalmente fraintendano la domanda posta. Esistono certamente applicazioni aziendali in cui è appropriato restituire uno "0", anche se tecnicamente non è vero dal punto di vista matematico.
Sean Branchaw,

66

Questa sembrava essere la soluzione migliore per la mia situazione quando cercavo di affrontare la divisione per zero, cosa che succede nei miei dati.

Supponiamo di voler calcolare i rapporti maschio-femmina per i vari club scolastici, ma scopri che la query seguente non riesce e genera un errore di divisione per zero quando tenta di calcolare il rapporto per il Lord of the Rings Club, che non ha donne :

SELECT club_id, males, females, males/females AS ratio
  FROM school_clubs;

È possibile utilizzare la funzione NULLIFper evitare la divisione per zero. NULLIFconfronta due espressioni e restituisce null se sono uguali o altrimenti la prima espressione.

Riscrivi la query come:

SELECT club_id, males, females, males/NULLIF(females, 0) AS ratio
  FROM school_clubs;

Qualsiasi numero diviso per NULLNULLe non viene generato alcun errore.


6
Sì, in effetti, è MEGLIO MEGLIO di quell'altra risposta che ha ottenuto così tanti voti. Nella tua soluzione, hai almeno un NULL, che indica che non puoi fornire un risultato corretto. Ma se converti il ​​risultato da NULL a Zero, otterrai semplicemente risultati errati e fuorvianti.
SQL Police,

8
A proposito, se si vuole calcolare un rapporto maschio / femmina, allora vi consiglio di confrontare meglio al totale, in questo modo: select males/(males+females), females/(males+females). Questo ti darà la distribuzione percentuale di maschi e femmine in un club, come il 31% degli uomini, il 69% delle donne.
SQL Police,

44

Puoi anche farlo all'inizio della query:

SET ARITHABORT OFF 
SET ANSI_WARNINGS OFF

Quindi se hai qualcosa del genere 100/0restituirà NULL. L'ho fatto solo per query semplici, quindi non so come influenzerà quelle più lunghe / complesse.


1
Per me va bene. Nel mio caso, devo usare l'operazione di divisione nella clausola WHERE. Sono sicuro che non esiste un divisore zero, perché quando commento WHERE out, non ci sono valori zero nei risultati. Ma in qualche modo Query Optimizer si divide per zero durante il filtraggio. SET ARITHABORT OFF SET e ANSI_WARNINGS OFF funzionano - dopo 2 giorni di combattimenti con divisione per zero nella clausola WHERE. Grazie!
huhu78,

2
Questo "sembra" così sporco ma lo adoro! Necessario in una query che fa l'aggregazione e usa l'istruzione CASE non era un'opzione perché poi ho dovuto aggiungere quella colonna al GROUP BY che ha cambiato totalmente i risultati. Rendere la query iniziale una sottoselezione e quindi eseguire un GROUP BY sulla query esterna modifica anche i risultati poiché è presente una divisione.
Andrew Steitz,

1
OK, quindi mi piace ancora questa "soluzione", ma come molti di voi probabilmente hanno sentito, ho sentito che doveva esserci un modo "più pulito". Cosa succede se ho dimenticato di riattivare gli avvisi? O qualcuno ha appannato il mio codice (che non succede mai, vero?) E non ha pensato agli avvertimenti? Comunque, ho visto altre risposte su NULLIF (). Sapevo di NULLIF () ma non mi rendevo conto di dividere per NULL restituisce NULL (pensavo che sarebbe stato un errore). Quindi ... sono andato con il seguente: ISNULL ((SUM (foo) / NULLIF (SUM (bar), 0)), 0) AS Avg
Andrew Steitz

2
Non conoscevo questa soluzione. Non sono sicuro che mi piaccia, ma potrebbe essere utile saperlo, un giorno. Grazie mille.
Henrik Staun Poulsen,

1
Questa è la soluzione più semplice, ma nota che danneggerà le prestazioni. Da docs.microsoft.com/en-us/sql/t-sql/statements/… : "L'impostazione di ARITHABORT su OFF può influire negativamente sull'ottimizzazione delle query con conseguenti problemi di prestazioni".
Mono Blaine,

36

È possibile almeno interrompere l'interruzione della query con un errore e restituire NULLse esiste una divisione per zero:

SELECT a / NULLIF(b, 0) FROM t 

Tuttavia, non lo trasformerei MAI in Zero con coalescecome è mostrato in quell'altra risposta che ha ottenuto molti voti. Questo è completamente sbagliato in senso matematico ed è persino pericoloso poiché l'applicazione probabilmente restituirà risultati errati e fuorvianti.


32

EDIT: Recentemente sto ricevendo molti voti negativi su questo ... quindi ho pensato di aggiungere solo una nota che questa risposta è stata scritta prima che la domanda subisse la sua modifica più recente, in cui il ritorno di null era evidenziato come un'opzione .. .che sembra molto accettabile. Una parte della mia risposta è stata indirizzata a preoccupazioni come quella di Edwardo, nei commenti, che sembravano sostenere la restituzione di uno 0. Questo è il caso contro cui mi sono opposto.

RISPOSTA: Penso che ci sia un problema di fondo qui, che è che la divisione per 0 non è legale. È un'indicazione che qualcosa è fondamentalmente sbagliato. Se stai dividendo per zero, stai provando a fare qualcosa che non ha senso matematicamente, quindi nessuna risposta numerica che puoi ottenere sarà valida. (L'uso di null in questo caso è ragionevole, in quanto non è un valore che verrà utilizzato nei calcoli matematici successivi).

Quindi Edwardo nei commenti "cosa succede se l'utente inserisce uno 0?", E sostiene che dovrebbe essere corretto ottenere uno 0 in cambio. Se l'utente inserisce zero nell'importo e si desidera che venga restituito 0 quando lo fanno, è necessario inserire il codice a livello delle regole aziendali per acquisire quel valore e restituire 0 ... non avere un caso speciale in cui la divisione per 0 = 0.

Questa è una differenza sottile, ma è importante ... perché la prossima volta che qualcuno chiama la tua funzione e si aspetta che faccia la cosa giusta, e fa qualcosa di funky che non è matematicamente corretto, ma gestisce solo il caso limite particolare che ha un buone possibilità di mordere qualcuno più tardi. Non stai davvero dividendo per 0 ... stai solo restituendo una cattiva risposta a una cattiva domanda.

Immagina di codificare qualcosa e di rovinarlo. Dovrei leggere in un valore di ridimensionamento della misurazione della radiazione, ma in uno strano caso limite non ho previsto, ho letto in 0. Quindi trascino il mio valore nella tua funzione ... mi restituisci uno 0! Evviva, nessuna radiazione! Solo che è davvero lì ed è solo che stavo passando un valore negativo ... ma non ne ho idea. Voglio che la divisione lanci l'errore perché è la bandiera che qualcosa non va.


15
Non sono d'accordo. Le tue regole aziendali non dovrebbero mai finire per fare matematica illegale. Se finisci per fare qualcosa del genere molto probabilmente il tuo modello di dati è sbagliato. Ogni volta che si incontra una divisione per 0, è necessario ponderare se i dati dovrebbero essere stati NULL anziché 0.
Remus Rusanu,

32
Non riesco a credere di essere stato retrocesso da qualcuno che mi chiede se ho mai "fatto una vera programmazione?" perché sto dicendo di farlo bene, piuttosto che essere pigro. sospiro
Beska,

11
Mi dispiace, non volevo offenderti. Ma la domanda è perfettamente valida in molte comuni applicazioni LOB, e rispondere con una "divisione per 0 non è legale" non aggiunge valore IMHO.
Eduardo Molteni

2
@JackDouglas Right. Questo è un caso in cui si desidera che le regole aziendali gestiscano un caso speciale in un modo speciale ... ma non dovrebbe essere la matematica sottostante a restituire uno spazio. Dovrebbe essere la regola aziendale. La risposta accettata restituisce un valore nullo, che è un modo corretto per gestirlo. Anche lanciare un'eccezione andrebbe bene. Individuarlo e gestirlo prima che passi all'SQL sarebbe probabilmente l'ideale. Fornire un qualche tipo di funzione che altre cose potrebbero chiamare che hanno restituito un valore matematicamente errato non è la strada da percorrere, perché quel caso speciale potrebbe non essere applicabile per quegli altri chiamanti.
Beska,

4
@JackDouglas Sì, è un buon riassunto, con cui sono d'accordo. Inizialmente la domanda sembrava essere formulata come "cosa posso fare per nascondere questo errore". Da allora, si è evoluto. Restituire un valore nullo, la risposta a cui arriva alla fine, sembra una risposta ragionevole. (Stavo fortemente sostenendo di non restituire uno 0 o qualche altro numero.)
Beska

28
SELECT Dividend / ISNULL(NULLIF(Divisor,0), 1) AS Result from table

Catturando lo zero con un nullif (), quindi il null risultante con un isnull () è possibile aggirare la divisione per errore zero.


3
A causa della sua lunghezza, la tua risposta è stata raccomandata per la cancellazione. Nota che è sempre meglio aggiungere una piccola spiegazione di ciò che stai suggerendo, anche se sembra molto semplice;)
Trinimon

10

Sostituire "dividi per zero" con zero è controverso, ma non è nemmeno l'unica opzione. In alcuni casi la sostituzione con 1 è (ragionevolmente) appropriata. Mi trovo spesso a usare

 ISNULL(Numerator/NULLIF(Divisor,0),1)

quando osservo i cambiamenti nei punteggi / conteggi e desidero impostare il valore predefinito 1 se non ho dati. Per esempio

NewScore = OldScore *  ISNULL(NewSampleScore/NULLIF(OldSampleScore,0),1) 

Più spesso, in realtà ho calcolato questo rapporto altrove (non ultimo perché può generare alcuni fattori di aggiustamento molto grandi per i denominatori bassi. In questo caso normalmente controllo su OldSampleScore è maggiore di una soglia; che quindi preclude zero Ma a volte l '"hack" è appropriato.


1
@N Mason; sì, a volte 1 è un'opzione. Ma come ricordi la parte ISNULL quando digiti la barra rovesciata?
Henrik Staun Poulsen,

1
Scusa Henrik - Non sono sicuro di aver capito la domanda.
N Mason,

6

Ho scritto una funzione qualche tempo fa per gestirla per le mie stored procedure :

print 'Creating safeDivide Stored Proc ...'
go

if exists (select * from dbo.sysobjects where  name = 'safeDivide') drop function safeDivide;
go

create function dbo.safeDivide( @Numerator decimal(38,19), @divisor decimal(39,19))
   returns decimal(38,19)
begin
 -- **************************************************************************
 --  Procedure: safeDivide()
 --     Author: Ron Savage, Central, ex: 1282
 --       Date: 06/22/2004
 --
 --  Description:
 --  This function divides the first argument by the second argument after
 --  checking for NULL or 0 divisors to avoid "divide by zero" errors.
 -- Change History:
 --
 -- Date        Init. Description
 -- 05/14/2009  RS    Updated to handle really freaking big numbers, just in
 --                   case. :-)
 -- 05/14/2009  RS    Updated to handle negative divisors.
 -- **************************************************************************
   declare @p_product    decimal(38,19);

   select @p_product = null;

   if ( @divisor is not null and @divisor <> 0 and @Numerator is not null )
      select @p_product = @Numerator / @divisor;

   return(@p_product)
end
go

2
Ciao Ron, bella soluzione, tranne che ha un tipo di dati limitato (4 cifre decimali) e anche i nostri @divisori possono essere negativi. E come imponi il suo utilizzo? TIA Henrik Staun Poulsen
Henrik Staun Poulsen,

1
L'ho accelerato abbastanza rapidamente per gestire uno scenario di problema specifico in quel momento. App per sviluppatori singola, quindi l'applicazione non è così difficile, tranne per la mia memoria. :-)
Ron Savage,

5
Nonostante l'istruzione print, non è un proc memorizzato, è un UDF scalare. Questo ti ucciderà in MS-SQL se fa parte di una query.
Mark Sowul

4
Sono d'accordo con l'affermazione di Mark Sowul secondo cui la funzione scalare causerà dolore. Questo è un suggerimento terribile in T-SQL, non farlo! Le funzioni scalari sono distruttori di prestazioni! Le funzioni con valori di tabella in linea sono le uniche buone funzioni utente in SQL Server (probabilmente con l'eccezione delle funzioni CLR che possono funzionare bene).
Davos,

4
  1. Aggiungi un vincolo CHECK che impone Divisordi essere diverso da zero
  2. Aggiungi un validatore al modulo in modo che l'utente non possa inserire valori zero in questo campo.

1
Comincio ad apprezzare sempre di più i vincoli CHECK.
Henrik Staun Poulsen,

4

Per aggiornare SQL:

update Table1 set Col1 = Col2 / ISNULL(NULLIF(Col3,0),1)

3
ciao Vijay, Sì, funzionerà, ma ... starei attento alla parte ISNULL, dove finisci per dividere NULL. Preferirei segnalare all'utente che il risultato è sconosciuto perché il divisore è zero.
Henrik Staun Poulsen,

2
Mi ha salvato in una subquery complicata, grazie.
QMaster,

3

Non esiste un'impostazione globale magica "disattiva la divisione per 0 eccezioni". L'operazione deve essere lanciata, poiché il significato matematico di x / 0 è diverso dal significato NULL, quindi non può restituire NULL. Presumo che tu ti stia occupando dell'ovvio e le tue domande hanno condizioni che dovrebbero eliminare i record con il divisore 0 e non valutare mai la divisione. Il solito 'gotcha' è che la maggior parte degli sviluppatori si aspetta che SQL si comporti come linguaggi procedurali e offra un cortocircuito logico all'operatore, ma NON lo fa . Vi consiglio di leggere questo articolo: http://www.sqlmag.com/Articles/ArticleID/9148/pg/2/2.html


4
Esiste una tale "impostazione globale magica"; DISATTIVARE ARITHABORT.
David Manheim,

3

Ecco una situazione in cui puoi dividere per zero. La regola aziendale è che per calcolare i turni di inventario, si prende il costo delle merci vendute per un periodo, lo si annualizza. Dopo aver ottenuto il numero annualizzato, dividi per l'inventario medio per il periodo.

Sto cercando di calcolare il numero di giri di inventario che si verificano in un periodo di tre mesi. Ho calcolato che ho un costo della merce venduto durante il periodo di tre mesi di $ 1.000. Il tasso di vendita annuale è di $ 4.000 ($ 1.000 / 3) * 12. L'inventario iniziale è 0. L'inventario finale è 0. Il mio inventario medio è ora 0. Ho un fatturato di $ 4000 all'anno e nessun inventario. Questo produce un numero infinito di turni. Ciò significa che tutto il mio inventario viene convertito e acquistato dai clienti.

Questa è una regola aziendale su come calcolare i turni di inventario.


3
Sì, hai quindi un numero infinito di turni. Quindi, in questo caso, se hai una divisione per zero, dovresti mostrare qualcosa come '#INF'.
SQL Police,

1
"L'inventario iniziale è 0. L'inventario finale è 0. Il mio inventario medio ora è 0." Il tuo calcolo è una stima. A un certo punto l'inventario è positivo o non è possibile spedire / vendere nulla. Se non sei soddisfatto di + ∞, usa una stima migliore dell'inventario medio.
Tom Blodget il

2
CREATE FUNCTION dbo.Divide(@Numerator Real, @Denominator Real)
RETURNS Real AS
/*
Purpose:      Handle Division by Zero errors
Description:  User Defined Scalar Function
Parameter(s): @Numerator and @Denominator

Test it:

SELECT 'Numerator = 0' Division, dbo.fn_CORP_Divide(0,16) Results
UNION ALL
SELECT 'Denominator = 0', dbo.fn_CORP_Divide(16,0)
UNION ALL
SELECT 'Numerator is NULL', dbo.fn_CORP_Divide(NULL,16)
UNION ALL
SELECT 'Denominator is NULL', dbo.fn_CORP_Divide(16,NULL)
UNION ALL
SELECT 'Numerator & Denominator is NULL', dbo.fn_CORP_Divide(NULL,NULL)
UNION ALL
SELECT 'Numerator & Denominator = 0', dbo.fn_CORP_Divide(0,0)
UNION ALL
SELECT '16 / 4', dbo.fn_CORP_Divide(16,4)
UNION ALL
SELECT '16 / 3', dbo.fn_CORP_Divide(16,3)

*/
BEGIN
    RETURN
        CASE WHEN @Denominator = 0 THEN
            NULL
        ELSE
            @Numerator / @Denominator
        END
END
GO

Non mi piace la tua soluzione, perché l'utilizzo di un UDF forza l'esecuzione della query in una singola modalità thread. Mi piace la tua configurazione di prova. Mi piacerebbe averlo in tutti i nostri UDF.
Henrik Staun Poulsen,

Per me questa soluzione è perfetta ed elegante
Payedimaunt il

@Payedimaunt; sì, le UDF portano a un codice molto elegante. Ma non funziona bene. Questo è "cursori su sonniferi". :-) È anche difficile ricordare di scrivere dbo.Divide invece di un normale "/"
Henrik Staun Poulsen,

1

Filtra i dati utilizzando una clausola where in modo da non ottenere 0 valori.


1

A volte, 0 potrebbe non essere appropriato, ma a volte 1 non è appropriato. A volte un salto da 0 a 100.000.000 descritto come variazione dell'1 o del 100 percento potrebbe anche essere fuorviante. Il 100.000.000 per cento potrebbe essere appropriato in quello scenario. Dipende dal tipo di conclusioni che intendi trarre in base alle percentuali o ai rapporti.

Ad esempio, un articolo di vendita molto piccolo che passa da 2-4 venduti e un articolo di vendita molto grande che passa da 1.000.000 a 2.000.000 venduti potrebbe significare cose molto diverse per un analista o per il management, ma verrebbero entrambi al 100% o 1 modificare.

Potrebbe essere più semplice isolare i valori NULL piuttosto che frugare su un mucchio di righe 0% o 100% mescolate con dati legittimi. Spesso, uno 0 nel denominatore può indicare un errore o un valore mancante e potresti non voler semplicemente inserire un valore arbitrario solo per rendere ordinato il tuo set di dati.

CASE
     WHEN [Denominator] = 0
     THEN NULL --or any value or sub case
     ELSE [Numerator]/[Denominator]
END as DivisionProblem

1
Trovo che il problema sia ricordare di fare qualcosa ogni volta che vuoi fare una divisione. Se non ricordi di aver aggiunto CASE o NULLIF, riceverai un caso di supporto in x settimane, un lunedì mattina. Odio che.
Henrik Staun Poulsen,

1

Ecco come l'ho risolto:

IIF (Valore A! = 0, Totale / Valore A, 0)

Può essere racchiuso in un aggiornamento:

SET Pct = IIF (Valore A! = 0, Totale / Valore A, 0)

O in una selezione:

SELEZIONA IIF (Valore A! = 0, Totale / Valore A, 0) AS Pct FROM Tablename;

Pensieri?


Io e altri scopriamo che sostituire "sconosciuto" con zero è una soluzione pericolosa. Preferisco di gran lunga NULL. Ma la parte difficile è ricordare di aggiungere iif o annullare su tutte le divisioni!
Henrik Staun Poulsen,

0

È possibile gestire l'errore in modo appropriato quando si propaga al programma chiamante (o ignorarlo se è quello che si desidera). In C # tutti gli errori che si verificano in SQL genereranno un'eccezione che posso rilevare e quindi gestire nel mio codice, proprio come qualsiasi altro errore.

Sono d'accordo con Beska in quanto non vuoi nascondere l'errore. Potresti non avere a che fare con un reattore nucleare ma nascondere errori in generale è una cattiva pratica di programmazione. Questo è uno dei motivi per cui i più moderni linguaggi di programmazione implementano la gestione strutturata delle eccezioni per disaccoppiare il valore di ritorno effettivo con un codice di errore / stato. Questo è particolarmente vero quando stai facendo matematica. Il problema più grande è che non è possibile distinguere tra 0 restituito correttamente calcolato o 0 come risultato di un errore. Invece qualsiasi valore restituito è il valore calcolato e se qualcosa va storto viene generata un'eccezione. Questo ovviamente differirà a seconda di come si accede al database e di quale lingua si sta utilizzando, ma si dovrebbe sempre essere in grado di ricevere un messaggio di errore che è possibile gestire.

try
{
    Database.ComputePercentage();
}
catch (SqlException e)
{
    // now you can handle the exception or at least log that the exception was thrown if you choose not to handle it
    // Exception Details: System.Data.SqlClient.SqlException: Divide by zero error encountered.
}

1
Penso che siamo tutti d'accordo sul fatto che nascondere l'errore con uno 0 non sia una soluzione. Quello che propongo è di scrivere il nostro codice in modo tale che ogni "/" sia seguito da un "NULLIF". In questo modo il mio rapporto / reattore nucleare non viene lasciato solo, ma mostra un "NULL" invece di quel fastidioso errore 8134. Di causa, se ho bisogno di un processo diverso quando il divisore è 0, allora Beska e sono d'accordo. Dobbiamo codificarlo. È difficile farlo ogni volta che scrivi un "/". "/ NULLIF" non è impossibile da fare ogni volta.
Henrik Staun Poulsen il

0

Usa NULLIF(exp,0)ma in questo modo -NULLIF(ISNULL(exp,0),0)

NULLIF(exp,0)si interrompe se exp è nullma NULLIF(ISNULL(exp,0),0)non si romperà


1
Non riesco a ottenere NULLIF (exp, 0), se 0 è uno zero, non una o. Provare; DECLARE @i INT SELECT 1 / NULLIF (@i, 0) per vedere se riesci a romperlo.
Henrik Staun Poulsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.