postgresql 将值从jsonb列复制到另一个嵌套的jsonb列

5jvtdoz2  于 12个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(228)

我有一个实体,它有两个jsonb列:"options"和"features"。我想从options列中的字段复制数据到features中的两个级别的字段。我尝试过:

UPDATE entity 
SET features = jsonb_set(  features
                         , '{informations}'
                         , "features"->'informations' 
                         ||'{"test": "options"->'test'}'
                         , true);

字符串
但是我在尝试运行迁移时遇到了这个错误:

QueryFailedError: syntax error at or near "test"


我认为{}和test周围的简单引号会产生错误。
我该怎么做?
仅供参考:反向迁移与以下各项完美配合:

UPDATE entity 
SET options = jsonb_set(  options
                        , '{test}'
                        , features->'informations'->'test'
                        , true);


因为这里没有嵌套的简单引号。

8iwquhpp

8iwquhpp1#

你只需要其中的几个引号,你还需要将提取的内容用括号括起来,否则它们将以一种不直观的顺序从左到右进行计算:db<>fiddle demo
| 特征|选项|
| --|--|
| {    “信息”:{        “features_k121”:121,        “features_k122”:{            “features_k131”:131        }    },    “features_k111”:11个文件夹|{1}    “test”:{        “options_key221”:221    },    “options_key211”:211个文件夹|

UPDATE entity 
SET features = jsonb_set(  features
                         , '{informations}'
                         , (features->'informations')
                         ||(options ->'test')
                         , true)
returning jsonb_pretty(features) as features
         ,jsonb_pretty(options) as options;

字符串
| 特征|选项|
| --|--|
| {    “信息”:{        “features_k121”:121,        “features_k122”:{            “features_k131”:131        },        “options_key221”:221    },    “features_k111”:11个文件夹|{1}    “test”:{        “options_key221”:221    },    “options_key211”:211个文件夹|
这是假设你想从options * 中的 * 字段**复制数据 *。如果你想复制 * 整个字段 *,你可以使用下面的查询,但请注意这不是一回事:

UPDATE entity 
SET features = jsonb_set(  features
                         , '{informations,test}'
                         , options->'test'
                         , true);


| 特征|选项|
| --|--|
| {    “信息”:{        “test”:{            “options_key221”:221        },        “features_k121”:121,        “features_k122”:{            “features_k131”:131        },        “options_key221”:221    },    “features_k111”:11个文件夹|{1}    “test”:{        “options_key221”:221    },    “options_key211”:211个文件夹|
我所指的非直观行为是这样的(如the demo所示):

features -> 'informations' || options -> 'test'


被这样评价:

((features -> 'informations') || options) -> 'test'


而不是像这样

(features -> 'informations') || (options -> 'test')

dfty9e19

dfty9e192#

解决办法是:

UPDATE domain
SET features = jsonb_set(features, '{informations,test}', "options"->'test', true)

字符串

相关问题