在红移中作为选择插入
Posted
技术标签:
【中文标题】在红移中作为选择插入【英文标题】:Insert into as select in redshift 【发布时间】:2016-08-03 04:27:50 【问题描述】:我有一张桌子 -
empno int(5) identity(1,1),
ename varchar(50) default '-0',
deptname varchar(50) default '-0'
当我使用语句时 -
insert into emp(ename, deptname) select ename, deptname from emp1;
我从 emp1 中获取所有值,但空值没有替换为 -0
,而是替换为 null
。
是什么原因?
【问题讨论】:
【参考方案1】:预期行为
根据Redshift documentation:
默认 default_expr
[...]
default_expr 表达式用于任何未指定列值的 INSERT 操作。如果未指定默认值,则该列的默认值为 null。
因此,当您执行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);
这会给:
select * from emp order by empno;
empno | ename | deptname
-------+------------+---------------
1 | some_ename | -0
2 | -0 | some_deptname
3 | -0 | -0
(3 rows)
您的问题的可能解决方案
选项 1:两个 INSERT
语句
专业人士:您无需了解实际的默认值 缺点:如果您有很多列,这可能会很乏味
insert into emp(ename) select ename from emp1 where deptname is null;
insert into emp(deptname) select deptname from emp1 where ename is null;
选项 2:使用COALESCE
专业版:一个查询default
他们全部
缺点:你必须知道默认值
insert into emp(ename, deptname)
select
coalesce(ename, '-0') as ename
, coalesce(deptname, '-0') as deptname
from
emp1
;
【讨论】:
以上是关于在红移中作为选择插入的主要内容,如果未能解决你的问题,请参考以下文章