Sql Vertica:在合并中,在满足条件时更改更新

Sql Vertica:在合并中,在满足条件时更改更新,sql,merge,insert,vertica,Sql,Merge,Insert,Vertica,我使用以下方法继续更新vertica数据库中的表: 上载要在暂存表stg_表中更新的行列表 在我的新表中操作插入: MERGE INTO table imb USING stg_table stg ON stg.member_id = imb.member_id WHEN MATCHED THEN UPDATE SET next_segment = stg.next_segment, untildate = stg.untildate WHEN NOT MATCHED THEN IN

我使用以下方法继续更新vertica数据库中的表:

  • 上载要在暂存表stg_表中更新的行列表
  • 在我的新表中操作插入:

    MERGE INTO table imb USING stg_table stg ON stg.member_id = imb.member_id
    WHEN MATCHED THEN UPDATE
    SET     next_segment = stg.next_segment,
    untildate = stg.untildate
    
    WHEN NOT MATCHED THEN INSERT
    (member_id,
     previous_segment,
     current_segment,
     next_segment,
     untildate) 
    VALUES
    (stg.member_id,
     stg.previous_segment,
     stg.current_segment,
     stg.next_segment,
     stg.untildate)
    
现在我有兴趣提出另一个条件:我希望“更新”只在表和stg_表都满足某些条件时发生

基本上,我想要的是:

    WHEN MATCHED THEN UPDATE
    SET     next_segment = stg.next_segment,
    untildate = stg.untildate
    WHERE stg.next_segment='x' AND  imb.current_segment='y'
==>这不起作用,因为我无法在Vertica中放置一个WHERE

我还尝试:

    WHEN MATCHED THEN UPDATE
    SET     next_segment = IF(stg.next_segment='x' AND  imb.current_segment='x',stg.next_segment,imb.next_segment)
    untildate = IF(stg.next_segment='x' AND  imb.current_segment='x',stg.untildate,imb.untildate)
==>这不起作用,因为我似乎无法在此处使用IF

我还想把我的附加条件放在“开”中,但我担心当成员id匹配而不是我的附加条件时,它会通过“插入”

如果有人知道我如何做才能达到我想要的目标,即

如果不匹配,则插入 匹配后,更新“但如果在这些情况下满足某些附加条件,则有时不会实际更新,请不要执行任何操作”

什么有效

elirevach向我指出了该案例,而不是IF将发挥作用:

    WHEN MATCHED THEN UPDATE
    SET     next_segment =  CASE stg.next_segment='x' AND  imb.current_segment='x'  THEN stg.next_segment ELSE imb.next_segment END,
    untildate = CASE stg.next_segment='x' AND  imb.current_segment='x' THEN stg.untildate ELSE imb.untildate END
另一种方法是启动3个请求,但更为繁重:

   MERGE INTO table imb USING stg_table stg ON stg.member_id = imb.member_id  AND  MyOtherCondition
   WHEN MATCHED THEN UPDATE ...

   MERGE INTO table imb USING stg_table stg ON stg.member_id = imb.member_id  AND  NOT MyOtherCondition
   WHEN MATCHED THEN UPDATE ...
插入:

   MERGE INTO table imb USING stg_table stg ON stg.member_id = imb.member_id  
   WHEN NOT MATCHED THEN INSERT ...

Somting like(永远不要在真实环境中测试它),当匹配时,然后更新SET next_segment=case当tg.next_segment='x'和imb.current_segment='y'时,然后stg.next_segment否则next_segment结束,untildate=case当tg.next_segment='x'和imb.current_segment='y'时,然后stg.untildate elae untildate–

是否尝试插入IF,case?类似于(切勿在真实环境中进行测试)如果匹配,则更新SET next_segment=case WHEN tg.next_segment='x'和imb.current_segment='y'然后stg.next_segment其他next_segment结束,untildate=case WHEN tg.next_segment='x'和imb.current_segment='y'然后stg.untildate elae untildate你的解决方案可以接受,如果你把它作为答案,即使这是一个比真正的编程更基本的语法问题,您是否尝试使用if,CASE?Somting(不要在真实环境中测试它)如果匹配,则更新SET next_segment=case WHEN tg.next_segment='x'和imb.current_segment='y'然后stg.next_segment其他next_segment结束,untildate=case WHEN tg.next_segment='x'和imb.current_segment='y'然后stg.untildate elae untildate你的解决方案可以接受,如果你把它作为回答,即使这更像是一个基本的语法问题而不是真正的编程。谢谢,它奏效了!在我的问题中添加了你的解决方案(以及我所做的变通方法)。谢谢,它奏效了!在我的问题中添加了你的解决方案(以及我所做的变通方法)