【问题标题】:Oracle Update updating NULL instead of value?Oracle 更新更新 NULL 而不是值?
【发布时间】:2015-04-02 04:37:03
【问题描述】:

我有一个类似的更新查询

update employees
set salary = salary - (select sum(salary) from employees where manager_id in (101,102))
where employee_id = 105;

上面的 sql 工作正常,但下面的 sql 正在更新 NULL 而不是 value。

UPDATE table1 a
SET    a.col1 = a.col1 - (SELECT SUM(b.col2)
                          FROM   table2 b
                          WHERE  b.col3 = 'AA'
                                 AND b.col4 = '1234'
                                 AND b.col5 = '123456789'
                                 AND b.col6 = 'O'
                                 AND b.col7 IN ( 1, 2, 3, 4 ))
WHERE  a.col3 = 'AA'
       AND a.col4 = '2313'
       AND a.col5 = '987654321';  

有人知道原因吗?

如果工资值中有一些 NULL 值,它会更新 NULL。 (我知道它不会,因为内部查询返回一个数字值)。

如果我硬编码内部查询的值,它工作正常,但如果我使用绑定参数则失败。 (但是,无论是硬编码还是使用绑定参数时,都会返回一个数值。)

我似乎不知道这个简单的查询有什么问题。

【问题讨论】:

  • by 这里是原始sql UPDATE TABLE1 a SET a.COL1 = a.COL1 - (SELECT SUM(b.COL2) FROM TABLE2 b WHERE b.COL3 = 'AA' AND b.COL4 = '1234' AND b.COL5 = '123456789' AND b.COL6 = 'O' AND b.COL7 IN (1,2,3,4) ) WHERE a.COL3 = 'AA' AND a.COL4 = '2313' AND a.COL5 = '987654321' ;
  • 最好在问题本身中添加这些详细信息,而不是评论。我已经编辑了你的问题,这次为你添加了。
  • 感谢先生的帮助。我会牢记这一课。
  • 关于您的问题,您可以使用 NVL,这样它只有在 NOT NULL 否则不会更改列时更新。看我的回答。

标签: sql oracle sql-update


【解决方案1】:

salary - (选择总和(salary)...

如果salarysub-query 返回NULL,则整个表达式 将返回NULL。 因此它会更新列值并将其设置为 NULL。

为避免这种情况,请在整个表达式上使用 NVL

例如,

SQL> CREATE TABLE t AS SELECT 1 A FROM dual;

Table created.

SQL>
SQL> SELECT * FROM t;

         A
----------
         1

SQL>
SQL> UPDATE t SET A = A - (SELECT NULL FROM dual);

1 row updated.

SQL>
SQL> SELECT * FROM t;

         A
----------


SQL>

因此,由于表达式导致 NULL,它更新为 NULL 值。让我们使用 NVL 来避免 NULL 时的更新:

SQL> ROLLBACK;

Rollback complete.

SQL> UPDATE t SET A = NVL(A - (SELECT NULL FROM dual), A);

1 row updated.

SQL>
SQL> SELECT * FROM t;

         A
----------
         1

SQL>

问题解决了!

让它更详细

上面的NVL方法就像IF NULL THEN REPLACE_VALUE

所以,你可以写一个 case 表达式让它看起来更冗长,它只是扩展了 NVL 表达式:

SQL> SELECT * FROM t;

         A
----------
         1

SQL> UPDATE t
  2  SET A =
  3    CASE
  4      WHEN (A -
  5        (SELECT NULL FROM dual
  6        )) IS NULL
  7      THEN A
  8      ELSE (A -
  9        (SELECT NULL FROM dual
 10        ))
 11    END;

1 row updated.

SQL> SELECT * FROM t;

         A
----------
         1

SQL>

【讨论】:

    猜你喜欢
    • 2014-05-30
    • 1970-01-01
    • 2012-08-29
    • 2020-12-02
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多