2013-03-09 114 views

回答

2

Oracle不支持此在創建或更改表的命令。

相反,使用:

ALTER TABLE your_table ADD c INTEGER; 

UPDATE your_table SET c = CASE WHEN store = 'T' THEN 1 ELSE 0 END; 
+0

這解決了眼前的事「添加一列」,但並沒有解決列的日常維護(是公平的提問並沒有提高,要麼)。 – APC 2013-03-09 20:10:40

+0

同意。這一切都取決於最終目標。如果所有你想要的是一個將T和D值映射爲0或1的列,那麼虛擬列或視圖可能最有意義。如果您只是爲值創建初始狀態,並且應用程序將繼續向前發展,則此解決方案可能是有意義的。 – DCookie 2013-03-09 20:16:18

+0

Oracle不承認COLUMN這個詞。第一個查詢應該是:ALTER TABLE your_table ADD c INTEGER; – 2017-02-17 15:11:53

1

視圖可以是一種解決方案:

create view v_your_table as 
select your_table.*, case when STORE = 'T' than 0 else 1 end as comp from your_table; 
+0

在創建的列中創建空值 – user2133404 2013-03-09 01:30:55

+0

計算列或視圖? – www 2013-03-09 01:37:11

+1

「COMPUTED BY」是Oracle RDB語法(Oracle收購的產品,但仍是一個單獨的東西)。 Oracle RDBMS 11g語法不同。 http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_3001.htm#BABIDDJJ – APC 2013-03-09 20:24:03

3

一個虛擬列可以做到在11g:

SQL> create table yourtab (store varchar2(1)); 

Table created. 

SQL> alter table yourtab add col as (case store when 'T' then 1 else 0 end); 

Table altered. 

SQL> insert into yourtab (store) values ('T'); 

1 row created. 

SQL> insert into yourtab (store) values ('D'); 

1 row created. 

SQL> select * from yourtab; 

S  COL 
- ---------- 
T   1 
D   0 

或觸發方法,如果你對10g或之前:它給

SQL> create table yourtab (store varchar2(1), col number); 

Table created. 

SQL> create trigger yourtab_biu 
    2 before insert or update on yourtab 
    3 for each row 
    4 declare 
    5 begin 
    6 :new.col := case :new.store when 'T' then 1 else 0 end; 
    7 end; 
    8/

Trigger created. 

SQL> insert into yourtab (store) values ('T'); 

1 row created. 

SQL> insert into yourtab (store) values ('D'); 

1 row created. 

SQL> select * from yourtab; 

S  COL 
- ---------- 
T   1 
D   0 
+0

這是我的查詢 'alter table rm_saicharan_finalv3do add col as(case store when'D'then 1 else 0 end);' 它說無效的數據類型。 – user2133404 2013-03-09 01:30:10

+0

@ user2133404你在10g或更低,然後我假設? – DazzaL 2013-03-09 01:35:55

+0

使用oracle sql developer – user2133404 2013-03-09 01:36:31