【问题标题】:Vertica : in a MERGE, changing the UPDATE when a condition is metVertica:在 MERGE 中,满足条件时更改 UPDATE
【发布时间】:2016-09-08 19:30:13
【问题描述】:

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

  • 上传我的行列表以在临时表 stg_table 中更新
  • 在我的新表中操作插入:

    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)
    

现在我有兴趣提出另一个条件:我希望只有在 table 和 stg_table 都满足某些条件时才会发生“更新”。

基本上,我想要类似的东西:

    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

我也想过将我的附加条件放在“ON”中,但我担心当member_id匹配但不是我的附加条件时它会通过“INSERT”。

如果有人知道我该怎么做才能实现我想要实现的目标,即

当不匹配时插入 WHEN MATCHED THEN UPDATE “但有时如果在这些情况下满足某些附加条件,请不要执行任何操作”

什么有效

elirevach 指出 CASE 而不是 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 ...

【问题讨论】:

  • 你尝试 instend of IF , CASE 吗?
  • Somting like(永远不要在真实环境中测试),匹配时然后更新设置 next_segment = case when tg.next_segment='x' AND imb.current_segment='y' then stg.next_segment else next_segment end , untildate = tg.next_segment='x' AND imb.current_segment='y' 然后 stg.untildate elae untildate 的情况
  • 您的解决方案有效,如果您将其作为答案发布,我可以接受,即使它是一个基本的语法问题而不是真正的编程

标签: sql merge insert vertica


【解决方案1】:

Somting like (永远不要在真实环境中测试它),当匹配然后更新设置 next_segment = case when tg.next_segment='x' AND imb.current_segment='y' then stg.next_segment else next_segment end , untildate = case when tg.next_segment='x' AND imb.current_segment='y' 然后 stg.untildate elae untildate –

【讨论】:

  • 谢谢它的工作!在我的问题中添加了您的解决方案(以及我所做的解决方法)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多