Reputation: 513
I need to update a table column with values that are derieved. To add little more complexity, I need to concat a value based on the derivate and hence the value to append for concat is not always the same. I came up with this query, but it apparently has a problem executing.
update TRANSFER set PROCESS_STATUS = concat ( PREDICATE ,
(select dom_value from DOMAIN_VALUES dv where dv.val_id = st.sr_cashflow_status
CASE PREDICATE WHEN dv.dom_value = 'ZZZZ' THEN 'SPB'
WHEN dv.dom_value = 'XXXX' THEN 'SPB'
WHEN dv.dom_value = 'YYYY' THEN 'SPB'
ELSE 'DPS'
END )) from TRANSFER st
where PROCESS_STATUS is null;
My main problem is that how do I maintain the appender (here, predicate) as dynamic value that can be checked on the value obtained by join?
Any answers/directions much appreciated.
Upvotes: 0
Views: 958
Reputation: 7922
I guess you are trying to achieve something like below (considering PREDICATE
is a column in TRANSFER
table)-
MERGE INTO TRANSFER st
using (select CASE
WHEN dv.dom_value = 'ZZZZ' THEN 'SPB'
WHEN dv.dom_value = 'XXXX' THEN 'SPB'
WHEN dv.dom_value = 'YYYY' THEN 'SPB'
ELSE 'DPS'
END as key,
val_id
from DOMAIN_VALUES) dv
on (dv.val_id = st.sr_cashflow_status and st.PROCESS_STATUS is NULL)
WHEN MATCHED THEN
UPDATE SET PROCESS_STATUS = concat(PREDICATE,dv.key);
OR
MERGE INTO TRANSFER st
using (select CASE
WHEN dv.dom_value = 'ZZZZ' THEN 'SPB'
WHEN dv.dom_value = 'XXXX' THEN 'SPB'
WHEN dv.dom_value = 'YYYY' THEN 'SPB'
ELSE 'DPS'
END as key,
val_id
from DOMAIN_VALUES) dv
on (dv.val_id = st.sr_cashflow_status and st.PROCESS_STATUS is NULL)
WHEN MATCHED THEN
UPDATE SET PROCESS_STATUS = PREDICATE||dv.key;
A quick note on your CASE
statement syntax. The syntax looks incorrect since you do not compare the outcome of the CASE
with anything since you are using this in a WHERE
clause, also you are missing AND
clause too.
update TRANSFER set PROCESS_STATUS = concat ( PREDICATE ,
(select dom_value from DOMAIN_VALUES dv where dv.val_id = st.sr_cashflow_status
CASE PREDICATE WHEN dv.dom_value = 'ZZZZ' THEN 'SPB' -- and clause missing
WHEN dv.dom_value = 'XXXX' THEN 'SPB'
WHEN dv.dom_value = 'YYYY' THEN 'SPB'
ELSE 'DPS'
END )) --comparison missing like CASE ... END = 'SPB' since the case is inside WHERE
from TRANSFER st -- you cannot have a FROM clause in UPDATE
where PROCESS_STATUS is null;
Upvotes: 1