在红移中作为选择插入

Fir*_*ame 4 amazon-web-services sql-insert amazon-redshift

我有一张桌子 emp -

empno int(5) identity(1,1),
ename varchar(50) default '-0',
deptname varchar(50) default '-0'
Run Code Online (Sandbox Code Playgroud)

当我使用语句时 -

insert into emp(ename, deptname) select ename, deptname from emp1;
Run Code Online (Sandbox Code Playgroud)

我从 emp1 获取所有值,但空值不是-0null.

是什么原因 ?

moe*_*tel 5

预期行为

根据Redshift 文档

默认default_expr

[...]

所述default_expr表达在不指定列值的任何INSERT操作中使用。如果未指定默认值,则该列的默认值为空。

因此,当您执行时,insert into emp(ename, deptname)您确实为这两列指定了值:如果没有别的,它们是NULL. 仅当您省略列时,才会使用默认值。因此default,只有直接插入值时,值才真正有用:

insert into emp(ename, deptname) values('some_ename', default);
insert into emp(ename, deptname) values(default, 'some_deptname');
insert into emp(ename, deptname) values(default, default);
Run Code Online (Sandbox Code Playgroud)

这会给:

select * from emp order by empno;
 empno |   ename    |   deptname
-------+------------+---------------
     1 | some_ename | -0
     2 | -0         | some_deptname
     3 | -0         | -0
(3 rows)
Run Code Online (Sandbox Code Playgroud)

您问题的可能解决方案

选项 1:两种INSERT说法

优点:您不需要知道实际的默认值
缺点:如果您有很多列,这可能很乏味

select * from emp order by empno;
 empno |   ename    |   deptname
-------+------------+---------------
     1 | some_ename | -0
     2 | -0         | some_deptname
     3 | -0         | -0
(3 rows)
Run Code Online (Sandbox Code Playgroud)

选项 2:使用 COALESCE

优点:对default它们进行一次查询
缺点:您必须知道默认值

insert into emp(ename) select ename from emp1 where deptname is null;
insert into emp(deptname) select deptname from emp1 where ename is null;
Run Code Online (Sandbox Code Playgroud)