2015-10-14 31 views
0

我試圖在表中插入數據,但我不想在該表中使用NULL,而是希望使用DEFAULT值作爲列中的列目標表如果源列在postgresql8.4中爲NULL,則設置目標列的默認值

ex- 
INSERT INTO dest_table 
(id, 
fname, 
lname 
) 
SELECT 
(
id, 
fname, 
lname 
) 
FROM src_table 

DDL對於目標表是

CREATE TABLE dest_table (
    id bigint NOT NULL DEFAULT 0, 
    fname varchar(55) NOT NULL DEFAULT 'unknown', 
    lname varchar(55) NOT NULL DEFAULT 'unknown' 
) 

DDL用於SRC表

CREATE TABLE dest_table (
     id bigint NOT NULL DEFAULT 0, 
     fname varchar(55), 
     lname varchar(55), 
     column1 int, 
........ has multiple columns 
    ) 

注 - 我有大量的列,我想這樣做而不使用COALESCE在我的選擇語句中的每一列。

+0

爲源表添加CREATE TABLE語句將有助於理解問題。 –

+0

我不明白它會如何幫助,但我只是編輯了問題 – Geek

回答

0

爲了解決這個問題,你可以使用條件表達式與CASE:

INSERT INTO dest_table (id, fname, lname) 
    SELECT id, 
     CASE 
      WHEN fname IS NULL THEN 'unknown' 
      ELSE fname 
      END, 
     lname FROM src_table 

完整的示例:

CREATE TABLE dest_table (
    id bigint NOT NULL DEFAULT 0, 
    fname varchar(55) NOT NULL DEFAULT 'unknown', 
    lname varchar(55) NOT NULL DEFAULT 'unknown' 
); 
INSERT INTO dest_table (fname,lname) VALUES ('alfa1','beta1'); 
INSERT INTO dest_table (fname,lname) VALUES ('alfa2','beta2'); 
INSERT INTO dest_table (fname,lname) VALUES ('alfa3','beta3'); 

CREATE TABLE src_table (
    id bigint NOT NULL DEFAULT 0, 
    fname varchar(55), 
    lname varchar(55), 
    column1 int 
); 
INSERT INTO src_table (fname,lname) VALUES ('foo1','bar1'); 
INSERT INTO src_table (fname,lname) VALUES ('foo2','bar2'); 
INSERT INTO src_table (fname,lname) VALUES ('foo3','bar3'); 
INSERT INTO src_table (fname,lname) VALUES (null,'bar3'); 

INSERT INTO dest_table (id, fname, lname) 
    SELECT id, 
     CASE 
      WHEN fname IS NULL THEN 'unknown' 
      ELSE fname 
      END, 
     lname FROM src_table 
+0

感謝您的答案! 但我不確定它與使用COALESCE有什麼不同?事實上使用CASE涉及更多的打字和像我指定的問題我有大量的列,我不想專門在每列上條件 – Geek

0

您可以使用一個觸發器,並驗證列:每次有NULL時間,將其替換爲默認值。 NEW。*和OLD。*在pl/pgSQL中將新值和舊值保存在觸發器函數中。

哦,順便說一下,PG 8.4是EOL了一年多現在: http://www.postgresql.org/support/versioning/

+0

我希望我可以使用觸發器,但不幸的是我在基於psql8的Greenplum上。 4和greenplum觸發器不允許更新列值 – Geek

+0

實際上,Greenplum基於PostgreSQL 8.2,而不是8.4。但是它從後來的PG版本中獲得了許多功能。 Greenplum並未正式支持觸發器,因爲您不知道觸發器是在主器件還是在片段上執行。這使得執行觸發器具有不可預測性。 –

0

的OP說,他不希望這是一個答案,但我將其列爲爲益答案的其他人可能正在查看此問題:

INSERT INTO dest_table 
(id, 
fname, 
lname 
) 
SELECT 
(
id, 
coalesce(fname, 'unknown') as fname, 
coalesce(lname, 'unknown') as lname 
) 
FROM src_table 
相關問題