在PostgreSQL中插入从表和字符串和空值中选择

时间:2017-08-29 00:13:47

标签: sql postgresql

我有一个PostgreSQL表:

表-A

id, start_date, tracking_date, type, relationship_id

基本上,我试图删除tracking_date列并保留数据,为每个记录创建一个非空跟踪日期的新记录。新记录应该是原始记录的副本,除了start_date应该是原始行的tracking_date的值,新的tracking_date应该是NULL,最后类型应该是字符串值" type_b&# 34;对于以这种方式修改的所有记录。

到目前为止,我的查询是:

INSERT INTO table_a
  (id, start_date, tracking_date, type, relationship_id)
SELECT (id, start_date, NULL, "type_b", relationship_id)
FROM table_a
WHERE tracking_date IS NOT NULL;

我不认为选择NULL和/或字符串值" type_b"来自table_a是有效的。我想知道如何使用INSERT INTO SELECT FROM查询结构来插入另一个表中的值以及同一查询中的NULL和字符串值。 (或在多个查询中)

table_a
id, start_date, tracking_date, type, relationship_id
1, 1/1/1999, NULL, type_a, 100
1, 1/2/1999, 1/3/1999, type_a, 100

table_a
id, start_date, tracking_date, type, relationship_id
1, 1/1/1999, NULL, type_a, 100
1, 1/2/1999, 1/3/1999, type_a, 100
1, 1/3/1999, NULL, type_b, 100

(我的想法是,之后我会删除tracking_date列))

2 个答案:

答案 0 :(得分:0)

我假设您的tracking_date字段被定义为时间戳。在这种情况下,请尝试以下方法如果这不起作用,你得到的错误是什么?

INSERT INTO table_a 
(id, start_date, tracking_date, type, relationship_id) 
SELECT 
(id, start_date, NULL::timestamp, "type_b", relationship_id) 
FROM table_a 
WHERE tracking_date IS NOT NULL;

答案 1 :(得分:0)

您必须删除select中列列表周围的括号。

(id, start_date, NULL, "type_b", relationship_id)是具有匿名记录类型的单个列。

有关详细信息,请参阅手册:Row Constructors

此外:字符串必须放在单个引号之间。双引号(")用于标识符。 "type_b"是列的名称,'type_b'是字符串。

有关详细信息,请参阅手册:Constants

所以查询应该是:

INSERT INTO table_a (id, start_date, tracking_date, type, relationship_id)
SELECT id, start_date, NULL, 'type_b', relationship_id
FROM table_a
WHERE tracking_date IS NOT NULL;