【发布时间】: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 的情况
-
您的解决方案有效,如果您将其作为答案发布,我可以接受,即使它是一个基本的语法问题而不是真正的编程