在红移中作为选择插入

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
;

【讨论】:

以上是关于在红移中作为选择插入的主要内容,如果未能解决你的问题,请参考以下文章

在红移中计算一年中的周数作为excel中的weeknum()

如何获得最近 x 周数据的不同计数,但在红移中按周分组?

在红移中评估的顺序是啥

在红移中具有 DISTINCT 的 listagg

数据值“0”在红移中有无效格式错误

如何在红移中获取过去 X 周的数据?