【问题标题】:UPDATE psql table with SELECT in json在 json 中使用 SELECT 更新 psql 表
【发布时间】:2015-12-01 18:29:26
【问题描述】:

问题

column json
{"size": 120, "family": 5, "colour": 5552, "continent": 2, "animal_name": "Tiger"},
{"size": 200, "family": 5, "colour": 5552, "continent": 2, "animal_name": "Panda"},
{"size": 300, "family": 5, "colour": 5552, "continent": 2, "animal_name": "Lion"}


column name
default_animal
default_animal
default_animal

解决方案

column name
Tiger
Panda
Lion

说明:

在 TableName Animal 中,一列“json”包含所有相关数据。 (所有可用的“animal_name”) 但“名称”列还应包含相关的动物名称 - 而不是“默认动物”。

解决此任务最有效的方法是什么?

【问题讨论】:

    标签: json postgresql select sql-update


    【解决方案1】:
    CREATE TABLE animals (id SERIAL PRIMARY KEY,name TEXT,jsondata JSON);
    
    INSERT INTO animals(name,jsondata) VALUES
        ('default_animal','{"size": 120, "family": 5, "colour": 5552, "continent": 2, "animal_name": "Tiger"}'::JSON),
        ('default_animal','{"size": 200, "family": 5, "colour": 5552, "continent": 2, "animal_name": "Panda"}'::JSON),
        ('default_animal','{"size": 300, "family": 5, "colour": 5552, "continent": 2, "animal_name": "Lion"}'::JSON)
    ;
    
    UPDATE animals SET name = jsondata->>'animal_name' WHERE name = 'default_animal';
    

    【讨论】:

    • 09:37:12 Kernel error: ERROR: operator does not exist: text ->> unknown
    • 您使用的是哪个 postgres 版本? @Teletubbi-OSX 我已经用 postgres 9.4.4 对其进行了测试。你有JSONB 列类型吗?
    • data_type = text OS X psql (9.4.4, server 9.3.4)
    • ALTER TABLE animals ALTER COLUMN json TYPE JSONB USING json::JSONB; 导致```内核错误:错误:类型“jsonb”不存在```
    • @Teletubbi-OSX 我已经更新了 postgres v9.3.x 的答案(将类型从 JSONB 更改为 JSON)。 JSONB 是在 v9.4 中引入的,这就是您遇到错误的原因。
    【解决方案2】:

    假设 json 列恰好包含 Animal 的一个实例,则以下方法应该有效:

    update Animal set name = substring(json position("animal_name" in json) + 15 char_length(json) - 2 )

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      相关资源
      最近更新 更多