Sql Oracle concat具有动态值

Sql Oracle concat具有动态值,sql,oracle,Sql,Oracle,我需要用派生的值更新表列。为了增加一点复杂性,我需要基于派生的concat值,因此为concat附加的值并不总是相同的。我提出了这个查询,但它显然在执行时有问题 update TRANSFER set PROCESS_STATUS = concat ( PREDICATE , (select dom_value from DOMAIN_VALUES dv where dv.val_id = st.sr_cashflow_status CASE PREDI

我需要用派生的值更新表列。为了增加一点复杂性,我需要基于派生的concat值,因此为concat附加的值并不总是相同的。我提出了这个查询,但它显然在执行时有问题

    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;
我的主要问题是,如何将appender(这里是谓词)维护为动态值,可以对join获得的值进行检查


非常感谢您的回答/指导。

我想您正在尝试实现以下目标(考虑到
谓词
传输
表中的一列)-

关于
CASE
语句语法的简要说明。语法看起来不正确,因为您没有将
案例
的结果与任何内容进行比较,因为您在
WHERE
子句中使用了它,而且您也缺少
子句

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;

首先,它应该是st*而不是**ts。您可以使用子查询,然后使用Concat。如果您仍然面临问题,请发布模式和正确的问题陈述。是的,请发布模式。我假设谓词属于传输表?我也不确定你的案例陈述是否有意义——你能准确地指出你想做什么吗?对不起,我应该更清楚地回答我的问题。模式看起来像这样-传输(ID,现金流,…,现金流状态,流程状态…),域值(ID,类型,值)。我需要更新PROCESS_STATUS的值,方法是获取CASHFLOW_STATUS,它是域_值上的一个fk(因此我需要与域_值合并以获得“value”的值),然后使用字符串将其合并。concat inturn的这个字符串取决于DOMAIN_VALUES中value的值,因此我使用了case。@DheerajJoshi感谢您的注意,尽管这只是一个输入错误。在我最初的查询中,我使用的是st而不是tsIt,它似乎不起作用。我在MERGE方面没有太多经验,但USING子句应该包含要更新的源数据,对吗?在这里把箱子放进select对我来说似乎不太合适。我对我的问题做了更多的解释。USING应该有一个数据源或表,您想用它连接到您想更新的实际表中<代码>使用
可以有一个select查询或一个内联视图而不是一个表,
CASE
语句是正确的。我不知道你说的是什么意思,但这是最接近我所能假设的你的最终结果。仅供参考-您使用case语句的方式是不正确的,因为您没有将
case
的输出与任何东西进行比较,而是在
where
子句中使用它。嗯,这不是我要找的答案,但是你的答案启发我考虑合并,最后我完成了我的工作。谢谢
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;
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;