1. ホーム
  2. amazon-web-services

[解決済み] as select in redshiftに挿入する。

2022-02-18 17:08:41

質問

テーブルemp - があります。

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 からすべての値を取得していますが、null 値が置換されていません。 -0 でなく null .

その理由は何ですか?

解決方法は?

意図した動作

によると Redshiftのドキュメント :

デファクト 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:2つ INSERT ステートメント

Pro:実際のデフォルト値について知る必要はない
欠点:カラム数が多い場合、面倒かもしれない。

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

Pro: への1つのクエリ default すべて
Con: デフォルト値を知っておく必要があります。

insert into emp(ename, deptname)
    select
        coalesce(ename, '-0')    as ename
      , coalesce(deptname, '-0') as deptname
    from
        emp1
;