Vertica:在 MERGE 中,满足条件时更改 UPDATE
Vertica : in a MERGE, changing the UPDATE when a condition is met
我使用以下方法继续更新我的 vertica 数据库中的 table:
- 上传我的行列表以在暂存中更新 table stg_table
在我的新 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)
现在我有兴趣提出另一个条件:我希望 "UPDATE" 只有在 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"。
如果有人知道我该怎么做才能实现我想要实现的目标,即
不匹配则插入
匹配后更新 "but sometimes do not actually update if some additional condition is met in these cases pls do nothing"
有效方法
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 ...
有点像(永远不要在真实环境中测试它),当匹配时更新设置 next_segment = tg.next_segment='x' 和 imb.current_segment=[=13 时的情况=] then stg.next_segment else next_segment end , untildate = case when tg.next_segment='x' AND imb.current_segment='y' then stg.untildate elae 直到日期 –
我使用以下方法继续更新我的 vertica 数据库中的 table:
- 上传我的行列表以在暂存中更新 table stg_table
在我的新 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)
现在我有兴趣提出另一个条件:我希望 "UPDATE" 只有在 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"。
如果有人知道我该怎么做才能实现我想要实现的目标,即
不匹配则插入 匹配后更新 "but sometimes do not actually update if some additional condition is met in these cases pls do nothing"
有效方法
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 ...
有点像(永远不要在真实环境中测试它),当匹配时更新设置 next_segment = tg.next_segment='x' 和 imb.current_segment=[=13 时的情况=] then stg.next_segment else next_segment end , untildate = case when tg.next_segment='x' AND imb.current_segment='y' then stg.untildate elae 直到日期 –