使用带有IF的子查询更新列值

时间:2019-07-30 17:55:13

标签: oracle plsql oracle11g

我正在尝试使用ORACLE版本11更新具有多个varchar列的表:

UPDATE EXAMPLE_TABLE SET PARAMS = 
                        '{ '
                        ||'params:{p1: {'                            
                        ||'p2:\"'                             || P2                           ||'\",'                                   
                        ||'p3:\"'                             || P3                           ||'\",'                                       
                        ||'p4:\"'                             || P4                           ||'\",'
                        ||'p5: [\"'                           || PROBLEM_HERE                 ||'\"],'
                        ||'}}}'
WHERE P6='1';

在“ PROBLEM_HERE”变量中,我需要放置一个字符串,例如“ F1”,“ F2”,“ F3”,“ F4”或“ F1”或“ F3”,甚至是“” ...

所以我做了一个IF语句来构建该字符串:

IF P7 != 0 THEN
   pvalues := '\"'|| op1  ||'\"';
   IF P8 != 0 THEN
         pvalues := pvalues || ',\"'|| op2  ||'\"';
         IF AG_PERM_MOVER_RESELLER != 0 THEN
                 pvalues := pvalues || ',\"'|| op3  ||'\"';
                 IF AG_PERMI_AUTO_EDIT != 0 THEN
                        pvalues := pvalues || ',\"'|| op4  ||'\"';
                 END IF;
         END IF;
    END IF;    
END IF;

有什么主意,如果将其放在更新中怎么办? 仅光标?

3 个答案:

答案 0 :(得分:1)

我不太了解“ PROBLEM_HERE”变量是什么,但是假设您的IF可以执行您想要的操作,则可以嵌套CASE条件,如下所示:

Excel.Worksheet.getRanges()

只需将其PROBLEM_HERE替换为更新中的嵌套案例,就像这样:

with example_table_set (p7, p8, ag_perm_mover_reseller, ag_permi_auto_edit, op1, op2, op3, op4) as (
select 1, 2, 3, 4, 'A', 'B', 'C', 'D'from dual union all
select 1, 2, 0, 4, 'A', 'B', 'C', 'D'from dual union all
select 0, 2, 3, 4, 'L', 'M', 'N', 'O' from dual 
) --
select case when p7 != 0
            then '\"'|| op1  ||'\"' || 
                 case when p8 != 0
                      then ',\"'|| op2  ||'\"' ||
                           case when ag_perm_mover_reseller != 0
                                then ',\"'|| op3  ||'\"' ||
                                     case when ag_permi_auto_edit != 0
                                          then ',\"'|| op4  ||'\"'
                                          end
                                end
                      end
            end
from example_table_set;

答案 1 :(得分:1)

declare
  pvalues varchar2(4000);
  p7 number;
  p8 number;
  op1 varchar2(40);
  op2 varchar2(40);
  op3 varchar2(40);
  op4 varchar2(40);
  ag_perm_mover_reseller number;
  ag_permi_auto_edit     number;
begin
  -- do you if here
  if p7 != 0 
  then
    pvalues := '\"'|| op1  ||'\"';
    if p8 != 0 
    then
      pvalues := pvalues || ',\"'|| op2  ||'\"';
      if ag_perm_mover_reseller != 0 
      then
        pvalues := pvalues || ',\"'|| op3  ||'\"';
        if ag_permi_auto_edit != 0 
        then
          pvalues := pvalues || ',\"'|| op4  ||'\"';
        end if;
      end if;
    end if;    
  end if;

  -- do your update here
UPDATE  example_table 
SET     params = '{ '
                 ||'params:{p1: {'                            
                 ||'p2:\"'   || p2       ||'\",'                                   
                 ||'p3:\"'   || p3       ||'\",'                                       
                 ||'p4:\"'   || p4       ||'\",'
                 ||'p5: [\"' || pvalues  ||'\"],'
                 ||'}}}'
WHERE   p6='1';

  commit;
exception 
  when others then
    rollback;
    -- do something about the error
end;
/

答案 2 :(得分:0)

您不必。创建一个Pl / SQL匿名块,例如:

declare
  pvalues VARHCAR2(4000);
begin
  -- do you if here

  -- do your UPDATE here
  UPDATE EXAMPLE_TABLE 
  SET PARAMS = pvalues
  WHERE P6='1';

  COMMIT;
exception 
  when others then
    rollback;
    -- do something about the error
end;
/