0

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.

4

1 回答 1

1

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;
于 2012-09-04T22:11:42.907 回答