使用动态列值从另一个表填充一个表

问题描述 投票:0回答:1

嗨,我有表 sec_profile。我想用某些列填充 sec_profile 中的表 sec_status 。 我正在使用下面的 sql 来做到这一点

INSERT INTO sec_status (ukey, sec_date, active_flag)
SELECT ukey, sec_date,'Y'
FROM sec_profile

这工作正常。截至目前,我正在硬编码 active_flag = Y。我想根据 sec_profile 数据动态填充该标志。 如果 sec_date >= 今天的日期则 active_flag = Y 如果秒_日期< Today's date then active_flag = N

我能够使用单独的 UPDATE 语句来做到这一点,但是我想知道这可以作为我的主 sql 的一部分来完成吗?

sql postgresql
1个回答
0
投票

问题没有说明当

sec_date
NULL
时所需的行为。也没有提及对
NOT NULL
sec_date
active_flag
约束。完整定义如何处理
NULL
状态非常重要。

如果

sec_date IS NULL
意味着
active_flag
也应该是
NULL
,那么可以使用以下内容:

INSERT INTO sec_status (ukey, sec_date, active_flag)
SELECT ukey,
       sec_date,
       CASE
         WHEN sec_date < CURRENT_DATE THEN 'N'
         WHEN sec_date >= CURRENT_DATE THEN 'Y'
       END
FROM sec_profile;

如果

sec_date IS NULL
暗示
active_flag
'Y'
,则更改
CASE
表达式,如下所示:

INSERT INTO sec_status (ukey, sec_date, active_flag)
SELECT ukey,
       sec_date,
       CASE
         WHEN sec_date < CURRENT_DATE THEN 'N'
         ELSE 'Y'
       END
FROM sec_profile;

如果

sec_date IS NULL
意味着
active_flag
IS
'N'
,则执行以下操作:

INSERT INTO sec_status (ukey, sec_date, active_flag)
SELECT ukey,
       sec_date,
       CASE
         WHEN sec_date >= CURRENT_DATE THEN 'Y'
         ELSE 'N'
       END
FROM sec_profile;

sec_date
被约束为
NOT NULL
时,所有三个
CASE
表达式都会产生相同的结果。如果遇到
INSERT
NULL
并且
sec_date
active_flag
约束,第一个
NOT NULL
语句将引发异常。最后两个
INSERT
语句始终为
active_flag
赋值。

© www.soinside.com 2019 - 2024. All rights reserved.