【问题标题】:PostgreSQL INSERT dynamic value in jsonPostgreSQL 在 json 中插入动态值
【发布时间】:2017-12-01 11:38:45
【问题描述】:

有两个表:

CREATE TABLE user (
  id bigserial,
  name varchar(255),
  address varchar(255)
)

CREATE TABLE user_history (
  id bigserial,
  user_id int8
  user_json json,
  create_date timestamp
)

user.id 由DEFAULT 生成。

我想为正在创建的用户创建历史记录,但我不知道如何将生成的user.id 传递给 json。像这样的:

INSERT INTO user_history
VALUES (
  DEFAULT,
  (SELECT id FROM user WHERE name = 'Some name'),
  '{
    "id": GENERATED ID HERE,
    "name": "Some name",
    "address": "Some address"
   }',
  '2010-01-01 00:00:00'
);

Postgres 10

【问题讨论】:

    标签: sql json postgresql sql-insert


    【解决方案1】:

    在顶部:

    with c as (SELECT id FROM user WHERE name = 'Some name')
    INSERT INTO user_history (user_id,user_json,create_date)
    select  id, concat(
      '{
        "id": ',id,',
        "name": "Some name",
        "address": "Some address"
       }')::json,
      '2010-01-01 00:00:00'
    from c
    ;
    

    也可以使用json_build_object 来生成json?..

    here' working example

    更新

    我没有意识到 json 中的所有键/值都来自用户表,下面是较短的查询:

    INSERT INTO user_history (user_id,user_json,create_date)
    select  id, json_build_object('id',id,'name',name,'address',address), '2010-01-01 00:00:00'
    from "user"
    

    http://sqlfiddle.com/#!17/19a8e/3

    同样保存 user_json 并没有多大意义——你总是可以在 user_history.user_id 上通过 FK 获取它

    t=# select to_json(u) from "user" u;
                      to_json
    --------------------------------------------
     {"id":1,"name":"Some name","address":null}
    

    【讨论】:

    • 你错过了from id
    • @ClodoaldoNeto 是的 - 谢谢。我应该更好地检查我的代码
    • @VaoTsun 我不太明白json_build_object 的工作原理。我很高兴从select 传递整行,但我得到ERROR: subquery must return only one column。与row_to_json 相同。有没有办法将整个结果转换为 json?
    • @gorodkovskaya 我用你的确切架构和我的确切陈述添加了 wrking 示例 - 无法重现错误 - 插入行。
    • @VaoTsun 我做json_build_object((SELECT * FROM user WHERE name = 'Some name'))。我想我用错了函数
    猜你喜欢
    • 2012-02-27
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2014-01-24
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多