Postgres - 基于第二个表条件更新指标变量

时间:2015-02-17 18:30:16

标签: postgresql sql-update conditional-statements postgresql-9.3

我试图根据原始表中的行是否属于某个日期范围(在我的第二个表中指定 - bondmaturity)来有条件地填充原始表(tracedetail)中的指示符(1/0)列。 / p>

具体来说,我的第二个表提供了一个ID变量(cusip_id)和两个指定开始和结束日期(start_dt,end_dt)的列。如果'trd_exctn_dt'日期变量落在特定ID的此日期范围内,我需要在我的第一个表中填充'ontherun'变量为'1',如果不是,则需要'0'。

我尝试了很多方法,并且通过阅读一些线程认为使用CASE选项可能是正确的方法,但无法使其工作。任何帮助将非常感激。非常感谢。

UPDATE tracedetail a
  SET on_the_run = 
  (CASE WHEN 
      (a.cusip_id = b.cusip_id)
      AND (a.trd_exctn_dt::date >= b.start_dt::date)
      AND  (b.end_dt::date >= a.trd_exctn_dt::date)
  THEN 1 ELSE 0 END)
  FROM 
  (SELECT 
      cusip_id,
      start_dt,
      end_dt
   FROM bondmaturity)
  AS b;
道歉 - 请忽略这个问题。我相信我回答问题的正确方法是运行以下内容:

UPDATE tracedetail a
SET on_the_run = 1
FROM    (SELECT cusip_id,
                start_dt,
                end_dt
        FROM bondmaturity) AS b
WHERE   a.cusip_id = b.cusip_id
AND     a.trd_exctn_dt::date >= b.start_dt::date
AND     b.end_dt::date >= a.trd_exctn_dt::date;

在此之后,我运行了一个更新,以使用值“0”填充NULL值

UPDATE tracedetail
SET on_the_run = 
    CASE WHEN on_the_run IS NULL THEN 0 ELSE on_the_run END;

1 个答案:

答案 0 :(得分:0)

您可以使用EXISTS子查询条件,该条件将返回布尔类型(TRUE / FALSE)值。您必须将值转换为相应的整数值(1/0)。如果on_the_run字段已经是boolean类型而不是整数,那将是一个更好的设计。

UPDATE tracedetail a
  SET on_the_run = EXISTS
  (SELECT 1
     FROM bondmaturity b
    WHERE a.cusip_id = b.cusip_id
      AND a.trd_exctn_dt::date >= b.start_dt::date
      AND b.end_dt::date >= a.trd_exctn_dt::date
  )::integer;

您可以考虑向一个或两个表添加触发器,以便在更新任何日期字段时自动更新on_the_run字段。