【问题标题】:Oracle Pl SQL, conditional in UPDATE statementOracle Pl SQL,UPDATE 语句中的条件
【发布时间】:2014-10-30 19:23:35
【问题描述】:

我想创建一个存储过程,它可以灵活地处理对表的多个列的更新,但可能会提供或不提供所有或部分值。

比如这样的:

UPDATE some_table
SET

IF(I_COLUMN_1 is not NULL) THEN
   COLUMN_1 = I_COLUMN_1
END IF;

IF(I_COLUMN_2 is not NULL) THEN
   COLUMN_2 = I_COLUMN_2
END IF;

WHERE
SOME_KEY = I_SOME_KEY;

显然不对,只是给你一些伪代码来描述我的想法。

我现在能想到的唯一方法是检查每个变量,并为感觉非常糟糕的每一列运行单独的更新语句。

【问题讨论】:

  • I_SOME_KEY 将始终提供给程序,I_COLUMN_1, I_COLUMN_2,... 的值是否可以提供?
  • 是的,这是正确的,当没有提供数据时,我显然不想用 null 更新列。

标签: sql oracle plsql sql-update conditional


【解决方案1】:

这是一个可以完成这项工作的查询命题:

UPDATE some_table
SET COLUMN_1 = NVL(I_COLUMN_1, COLUMN_1)
   ,COLUMN_2 = NVL(I_COLUMN_2, COLUMN_2)
WHERE SOME_KEY = I_SOME_KEY

我对 Oracle 不是很熟悉,但在 T-SQL 中我会使用 ISNULL() 函数来完成这项工作,而在 Oracle 中等效的是 NVL() 函数。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我的第一个想法是在执行 UPDATE 语句之前操作 PL/SQL 中的变量。这是伪代码,但类似这样:

    I_COLUMN_1 [Datatype] := NVL2([Value of Incoming Parameter], [Value for Update if Not Null], NULL);
    I_COLUMN_2 [Datatype] := NVL2([Value of Incoming Parameter], [Value for Update If Not Null], NULL);
    UPDATE [some_table]
        SET COLUMN_1 = I_COLUMN_1, COLUMN_2 = I_COLUMN_2
        WHERE [some_key] = I_SOME_KEY;
    

    使用 NVL2(expression, return-if-not-null, return-if-null) 函数将对表达式求值,如果表达式不为 null,则返回一个值,如果表达式为 null,则返回第二个值。

    评估输入,然后更新表。 :)

    【讨论】:

    • 感谢 rcfmonarch,这样的事情也可以工作,但在我的情况下,它看起来像这样 NVL2(I_COLUMN_1, I_COLUMN_1, COLUMN_1) 因为我不想在 NULL 时返回 NULL,因为它会当没有通过新的更新值时开始擦除当前值。所以我发现 NVL 能够完成这项工作,而 NVL2 不是必需的。
    【解决方案3】:

    尝试条件更新,使用条件更新。

    这里是示例查询

    我们正在尝试根据员工的指定和总经验更新员工表中的薪水。

     UPDATE Employee emp
    SET emp_sal = (
      case 
        when emp.designation = 'SA' AND emp.totalExp > 5 then 5000
        when emp.designation = 'A' AND emp.totalExp > 3 then 3000
        else 15000
      end
    ) 
    

    根据您的具体要求尝试查询。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多