如何使用内部查询一次设置多个属性

qlzsbp2j  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(254)

假设我有一个这样的表结构

Table_AB
=========

+--------------+--------------+-----------+
| AttrA        | AttrB        | unique_id |
+--------------+--------------+-----------+
| {"a","b"}    | {"c","d"}    |     25    |
+--------------+--------------+-----------+

attra和attrb都是jsonb列。现在我的任务是更新表\u ab,以便从attra中删除键“a”,并从attrb中删除键“c”。结果应该是this:-

Table_AB
=========

+--------------+-------------+-----------+
| AttrA        | AttrB       | unique_id |
+--------------+-------------+-----------+
| {"b"}        | {"d"}       |    25     |
+--------------+-------------+-----------+

为此,我编写了如下查询:

UPDATE Table_AB
   SET AttrA = ( SELECT AttrA::jsonb #- '{a}' FROM Table_AB where unique_id= 25) ,
   SET AttrB = ( SELECT AttrB::jsonb #- '{c}' FROM Table_AB where unique_id= 25)
  FROM Table_AB where unique_id= 25;

我可以使用这个查询获得所需的输出。但是我想优化这个查询,只使用一个嵌套语句,而不是两个嵌套语句和一个语句,比如。。

UPDATE Table_AB
   SET AttrA, AttrB = ( SELECT AttrA::jsonb #- '{a}', AttrB::jsonb #- '{c}' 
                          FROM Table_AB 
                         WHERE unique_id= 25) 
  FROM Table_AB 
 WHERE unique_id= 25;

我怎样才能做到这一点?

llycmphe

llycmphe1#

可能需要较短的update语句

UPDATE Table_AB
   SET AttrA = AttrA::jsonb #- '{a}' ,
       AttrB = AttrB::jsonb #- '{c}'
 WHERE unique_id= 25

它没有任何子查询。

UPDATE Table_AB
   SET (AttrA, AttrB)=
       (AttrA::jsonb #- '{a}', AttrB::jsonb #- '{c}')
WHERE unique_id= 25

要设置的列及其各自的值用副词 Package 起来。
顺便说一句,你的陈述应该是

UPDATE Table_AB
   SET AttrA = ( SELECT AttrA::jsonb #- '{a}' FROM Table_AB where unique_id= 25) ,
       AttrB = ( SELECT AttrB::jsonb #- '{c}' FROM Table_AB where unique_id= 25)
 WHERE unique_id= 25

即使不是理想情况,也不会产生任何错误(不应优先考虑)。
演示

相关问题