【问题标题】:Insert Into Select From a Table and Strings and Nulls in PostgreSQL在 PostgreSQL 中插入从表中选择以及字符串和空值
【发布时间】:2017-08-29 00:13:46
【问题描述】:

我有一个 PostgreSQL 表:

table_a

id, start_date, tracking_date, type, relationship_id

基本上,我正在尝试删除 tracking_date 列并保留数据,为每个具有非空跟踪日期的记录创建一个新记录。新记录应该是原始记录的副本,除了 start_date 应该是原始行的 tracking_date 的值,新的 tracking_date 应该是 NULL 并且最后类型应该是所有以这种方式修改的记录的字符串值“type_b” .

到目前为止我的查询是:

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;

我不认为从 table_a 中选择 NULL 和/或字符串值“type_b”是有效的。我想知道如何使用 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 列))

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您必须删除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;
    

    【讨论】:

    • 成功了,删除括号并切换到使用单引号作为静态值修复它。 (我还必须从查询的两个部分中删除 id 字段,因为它是主键。)谢谢!!
    【解决方案2】:

    我假设您的 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;
    

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 2013-06-10
      • 2020-08-02
      • 1970-01-01
      相关资源
      最近更新 更多