在插入中,如何使空值为零或空



>我有一个包含 10 列的表,我的 INSERT 语句仅引用表中的特定列。

INSERT INTO SCHEMA.TABLE (COL_1, COL_2) VALUES (VAL_1, VAL_2);

。或。。。

INSERT INTO SCHEMA.TABLE (COL_1, COL_2) SELECT VAL_1, VAL_2 FROM SCHEMA_2.TABLE_2;

但是,当我执行它时,其他列总是以 null 值插入,而不是根据列类型(即数字)具有相应的列。也就是说,如果我有一个数字列,我应该看到一个零。

我怎样才能正确地插入?

请考虑我没有 DDL 权限,我正在尝试插入到现有表中。

最简单的方法可能是为您的列提供默认值:

ALTER TABLE schema.table MODIFY (COL_1 NUMBER DEFAULT 0);
DEFAULT

;但是,请注意,您必须注意所做的事情,因为列可能无法获得其默认值。下面是一个示例:

SQL> create table test
  2    (id       number primary key,
  3     name     varchar2(10),
  4     address  varchar2(20) default 'Unknown',      --> columns with default 
  5     num_val  number       default 0               --> values
  6    );
Table created.

如果您在插入值时没有指定应该获取默认值的列,则一切都将如您所愿:

SQL> insert into test (id, name) values (1, 'Little');
1 row created.
SQL> select * from test;
        ID NAME       ADDRESS                 NUM_VAL
---------- ---------- -------------------- ----------
         1 Little     Unknown                       0

看?ADDRESSNUM_VAL 都有默认值。

但是,如果您在语句INSERT中提到这些列,尽管将它们设置为 NULL ,但它们不会设置为默认值,而是NULL

SQL> insert into test (id, name, address, num_val)
  2    values (2, 'Foot', null, null);
1 row created.
SQL> select * from test;
        ID NAME       ADDRESS                 NUM_VAL
---------- ---------- -------------------- ----------
         1 Little     Unknown                       0
         2 Foot

如您所见,包含ID = 2的行在ADDRESSNUM_VAL列中没有获得默认值。

因此,请注意您的所作所为。

使用该列DEFAULT作为0

        use NVL( column_name, 0 ) --as per oracle syntax 
        --this would mean whenever theres null found for 
          -- that column set it to 0 (will work on insert)

    Update column set column=0 where column IS NULL
    --(will work after insert as the name suggests update)

虽然坦率地说我不建议这样做,但您可以使用触发器来实现您的目标:

CREATE OR REPLACE TRIGGER SCHEMA.TABLE_BI
  BEFORE INSERT ON SCHEMA.TABLE
  FOR EACH ROW
BEGIN
  :NEW.COL_1 := COALESCE(:NEW.COL_1, 0);        -- NUMBER column
  :NEW.COL_2 := COALESCE(:NEW.COL_2, ' ');      -- VARCHAR column
  :NEW.COL_3 := COALESCE(:NEW.COL_3, SYSDATE);  -- DATE column
END SCHEMA.TABLE_BI;

但是,创建触发器可能需要您没有的权限。

要回答这个问题:这需要在创建表时定义,确定默认值。在这种情况下,我无法做到这一点,因为表定义指示 NULL,即使在数字的情况下也是如此。

无论如何,谢谢。

相关内容

  • 没有找到相关文章

最新更新