разделение postgresql по обработке нулевых ошибок

#postgresql #divide-by-zero

Вопрос:

Значение масла иногда равно нулю. Мне нужно исключение деления на ноль, и оператор null if все еще выдает этот код ошибки. Не уверен, что не так с синтаксисом.
ОШИБКА: деление на ноль Состояние SQL: 22012

 WITH query1 AS (
   SELECT well_id, produced_at, oil,
  (EXTRACT(EPOCH FROM age(produced_at,
                          LAG(produced_at) OVER w))/3600)::int as hourly_rate
                          FROM public.production
WINDOW w AS (PARTITION BY well_id ORDER BY well_id, produced_at 
             ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
     
),
query2 as (
   select Well_id, produced_at, nullif(oil,0), hourly_rate,
   (nullif(oil,0)/hourly_rate*6) as Last_Six_Hours_Of_Production,
   (nullif(oil,0)/hourly_rate*12) as Last_Twelve_Hours_Of_Production
    from query1
)
Select *
from query2; 
 

Ответ №1:

Я думаю, что вам также нужно добавить некоторую NULLIF проверку к знаменателю и добавить COALESCE предложение.

 WITH query1 AS (
   SELECT well_id, produced_at, oil,
  (EXTRACT(EPOCH FROM age(produced_at,
                          LAG(produced_at) OVER w))/3600)::int as hourly_rate
                          FROM public.production
WINDOW w AS (PARTITION BY well_id ORDER BY well_id, produced_at 
             ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
     
),
query2 as (
   select Well_id, produced_at, nullif(oil,0), hourly_rate,
   COALESCE((nullif(oil,0)/nullif(hourly_rate*6,0)),0) as Last_Six_Hours_Of_Production,
   COALESCE((nullif(oil,0)/nullif(hourly_rate*12,0)),0) as Last_Twelve_Hours_Of_Production
    from query1
)
Select *
from query2;
 

Комментарии:

1. Да, это все исправило, большое вам спасибо.