如果postgresql8.4中的源列为NULL,则设置目标列的默认值

时间:2015-10-14 19:16:57

标签: postgresql postgresql-8.4

我正在尝试在表中插入数据,我不希望在该表中使用NULL,而是希望它对目标表中的列使用DEFAULT值

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'
)

用于src表的DDL

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

注意 - 我有大量的列,我想在不使用COALESCE的情况下为select语句中的每一列进行此操作。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用触发器并验证列:每次它为NULL时,将其替换为默认值。 pl / pgSQL中的NEW。*和OLD。*在触发函数中保存new和old值。

哦,顺便说一下,PG 8.4已经EOL超过一年了: http://www.postgresql.org/support/versioning/

答案 2 :(得分:0)

OP表示他不希望这个作为答案,但我将其列为可能正在考虑这个问题的其他人的利益的答案:

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