我正在尝试在表中插入数据,我不希望在该表中使用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语句中的每一列进行此操作。
答案 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