Oracle:基于过滤器的默认列值

时间:2014-12-30 06:24:27

标签: sql oracle oracle11g oracle10g

嗨,开发人员要求在表格上添加一个列,其默认值为' N'但是如果该条目的id = 3,则此列的默认值应为&# 39; Y',无论如何我能在oracle中实现这个目标吗?

5 个答案:

答案 0 :(得分:0)

11g方法

Oracle 11g开始,您可以使用VIRTUAL columns一步完成此操作。

测试用例

SQL> CREATE TABLE tab_default (
  2    ID          NUMBER,
  3    flag varchar2(1) GENERATED ALWAYS AS (decode(id, 3, 'Y', 'N')) VIRTUAL
  4  );

Table created.

SQL>
SQL> INSERT INTO tab_default (ID) VALUES (1);

1 row created.

SQL> INSERT INTO tab_default (ID) VALUES (3);

1 row created.

SQL> INSERT INTO tab_default (ID) VALUES (10);

1 row created.

SQL> SELECT * FROM tab_default;

        ID F
---------- -
         1 N
         3 Y
        10 N

SQL>

因此,DECODE列声明中的VIRTUAL函数可以处理您的需求。

10g方法

您可以使用 -

来满足要求
  1. DEFAULT
  2. 只要id = 3 ,
  3. AFTER INSERT TRIGGER

    创建表格,使DEFAULT值为“N”。只有在插入一个值为id column = 3的新行时才触发触发器,以便触发器将值更新为“Y”。否则对于所有其他情况,默认值为“N”。

答案 1 :(得分:0)

将新列添加到表后,您可以使用以下查询在列中插入值:

update table_name set column_name = ( case when id = 3 then 'Y'  else 'N' end );    

在插入新记录时,您可以使用以下方法:
1)在创建插入查询时确定列,您可以在创建查询时为其添加逻辑 2)在数据库中创建一个触发器,它应该在向表中插入任何新行后更新列值。

答案 2 :(得分:0)

这是一个非常糟糕的数据库设计。它不尊重关系数据库的正常形式。 我建议保持该表不变,并在表格上创建一个新视图,其中包含一个额外的列,该列使用DECODE或CASE WHEN ...

答案 3 :(得分:0)

我同意那些提到这不是一个好的数据库设计的评论者。也就是说,在现实生活中,与数据库设计妥协并不罕见。

我不确定虚拟列是否是想要的。 OP要求采用默认方式;虚拟列的工作方式与默认约束不同(例如,使用默认约束,我们可以将默认值以外的值插入列中。最佳路径可能是使用触发器设置“默认”值:

CREATE OR REPLACE TRIGGER mytrigger
  BEFORE INSERT ON mytable FOR EACH ROW
  WHEN (new.mycolumn IS NULL)
BEGIN
  SELECT DECODE(id, 3, 'Y', 'N') INTO :new.mycolumn FROM dual;
END;
/

无论您使用的是Oracle 10g还是11g(两者都标记了),触发器也会起作用。

希望这有帮助。

答案 4 :(得分:0)

使用附加值列创建一个新表:

create table table1 as
select u.*,
case when id=3 then 'Y' ELSE 'N'
  END value  
from table2 u