Падзяліць дзве калонкі, але пазбегнуць дзялення на нуль

Я хачу зрабіць нешта падобнае з табліцай часопіса падлучэння:

SELECT StartTime, EndTime, EventTime, SentBytes, SentObjects, \
    SentBytes/SentObjects AS bytes_per_object, \
    SentBytes/(EndTime - StartTime) AS bitrate, \
    (EndTime - StartTime) AS duration FROM [table];

Але ў некаторых падзеях время_запуска і EndTime могуць быць роўныя (нулявы працягласці), або SentObjects можа быць роўны нулю. Такім чынам, прыведзены вышэй запыт дае дзяленне на нуль. Як я магу перапісаць заяву так, што я атрымліваю вынік? Замена дзялення на нуль з -1 добра.

Я нешта накшталт гэтага трынітарнай аперацыі мыслення, але я не ведаю, як пісаць:

SELECT IFF(SentObjects > 0, SentBytes/SentObjects, -1) AS bytes_per_object FROM table;

SELECT .... WHERE SentObjects > 0 is not a desireable solution, as I want to see all the connections in one list.

SQL версія сервера 10_50

1

6 адказы

 select 1/nullif(0,0)

SELECT StartTime, EndTime, EventTime, SentBytes, SentObjects,  
    coalesce(SentBytes/NULLIF(SentObjects,0),-1) AS bytes_per_object,  
    coalesce(SentBytes/NULLIF((EndTime - StartTime),0),-1) AS bitrate,  
    (EndTime - StartTime) AS duration FROM [table] 

вы можаце пазбегнуць нуля з дапамогай наступнай функцыі

1
дададзена

Вы можаце таксама выкарыстоўваць агульныя таблічныя выразы (CTE): (неправераная скрыпт)

Ідэя заключаецца ў папярэдняй ацэнкі значэнняў слупкоў ўнутры КТР і выкарыстоўваць абноўленае значэнне ў аператары адбору.

;With CTE 
AS(
    SELECT StartTime, EndTime, EventTime, 
           IIF(SentObjects > 0, SentBytes, 1) AS SentBytesUpdated, \
           IIF(SentObjects > 0, SentObjects, -1) AS SentObjectsUpdated , \
           SentBytes/(EndTime - StartTime) AS bitrate, \
           (EndTime - StartTime) AS Duration \
    FROM [Table]
)SELECT StartTime, EndTime, EventTime, \
    SentBytesUpdated/SentObjectsUpdated AS bytes_per_object, \
    bitrate \
    Duration \
FROM [CTE]
0
дададзена
SELECT StartTime, EndTime, EventTime, SentBytes, SentObjects,
    SentBytes/(case when isnull(SentObjects, 0) = 0 then -1 else SentObjects end) AS bytes_per_object,
    SentBytes/(case when isnull((EndTime - StartTime), 0) = 0 then -1 else (EndTime - StartTime)end) AS bitrate,
    (EndTime - StartTime) AS duration FROM [table];
0
дададзена

Вы можаце выкарыстоўваць CASE WHEN ... THEN ... ELSE ... END :

SELECT StartTime, EndTime, EventTime, SentBytes, SentObjects,
    CASE WHEN SentObjects = 0 THEN -1 ELSE SentBytes/SentObjects END AS bytes_per_object,
    CASE WHEN EndTime = StartTime THEN -1 ELSE SentBytes/(EndTime - StartTime) END AS bitrate,
    (EndTime - StartTime) AS duration
FROM [table];
0
дададзена
SELECT StartTime, EndTime, EventTime, SentBytes, SentObjects, \
    SentBytes/SentObjects AS bytes_per_object, \
    isNull(SentBytes/nullif((EndTime - StartTime), 0), -1) AS bitrate, \
    (EndTime - StartTime) AS duration FROM [table];
0
дададзена
CASE
WHEN SentObjects > 0 THEN SentBytes/SentObjects
ELSE -1
END AS bytes_per_object
0
дададзена