VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

#-操作符

功能描述

Vastbase在PostgreSQL兼容模式下支持#-操作符,用于删除jsonb具有指定路径的域或者元素。

注意事项

  • 该功能仅在数据库兼容模式为PostgreSQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='PG')。

  • 若要删除多个键值或元素,则需多次分别#-指定各键值或元素,例如SELECT '{"name": "John", "age": 30, "name1": "Amy", "age1": 28, "hobby1":"basketball"}' #- '{name}' #- '{age}';可以正确删除两个键值。

    例如执行如下命令SELECT '{"name": "John", "age": 30, "name1": "Amy", "age1": 28, "hobby1":"basketball"}' #- '{name, age}';无法实现删除多个键值的目的。

  • 出现在路径中的数组索引为负整数时候,则从JSON数组的末尾开始计数。

  • 路径的数组索引所指元素位置,前值必须都存在,否则将不加改变的返回。

语法格式

jsonb #- text[]

参数说明

  • JSONB

    jsonb类型表达式,表示待删除的jsonb数据源。

  • text[]

    路径元素,可以是字段值或数组索引。用于指定要删除的域或元素。

示例

示例1:使用#-操作符删除键和元素。

1、删除一个和多个键。

SELECT '{"name": "John", "age": 30}' #- '{name}';
SELECT '{"name": "John", "age": 30, "name1": "Amy", "age1": 28, "hobby1":"basketball"}' #- '{name}' #- '{age}';

返回结果依次为如下,分别删除一个和多个键:

  ?column?
-------------
 {"age": 30}
(1 row)

                       ?column?
------------------------------------------------------
 {"age1": 28, "name1": "Amy", "hobby1": "basketball"}
(1 row)

2、删除一个和多个元素。

select '["a","b","c","d"]'::jsonb #- '{0}';
select '["a","b","c","dss"]'::jsonb #- '{2}'#- '{0}' #- '{-1}';
select '["a","b","c","dss"]'::jsonb #- '{4}';
  • 当路径指定的数组索引为负数时,从jsonb数组的末尾开始算起。

  • 当路径的数组索引所指元素位置为前数不存在的情况(即超出实际元素个数时),则不做删减。

返回结果为如下:

    ?column?
-----------------
 ["b", "c", "d"]
(1 row)

 ?column?
----------
 ["b"]
(1 row)

        ?column?
------------------------
 ["a", "b", "c", "dss"]
(1 row)

示例2: 对表字段设置默认值时使用#-操作符。

1、创建测试表,并在为字段指定默认值时使用#-操作符。

create table tb1_1171706(id int unique,a1 jsonb check(a1!='{}'),a2 jsonb default '{"name": "John", "age": 30}' #- '{name}',a3 jsonb not null);
create table tb2_1171706(id int unique,a1 jsonb check(a1!='{}'),a2 jsonb default '{"name": "John", "age": 30}' #- '{age}',a3 jsonb not null);

2、向测试表中插入数据并查询。

insert into tb1_1171706 values(1,'{"name":"test1"}','{"id":1001}','[null,"aaa"]');
insert into tb1_1171706 values(2,'{"name":"test2"}',default,'["true"]');
insert into tb1_1171706 values(3,'{"name":"test3"}','{"id":1003}','["a", {"b":1,"name": "John", "age": 30}]');
insert into tb2_1171706 values(1,'{"name":"test"}',default,'["null","T"]');
select * from tb1_1171706 order by id;
select * from tb2_1171706 order by id; 

查询结果为如下,tb1_1171706和tb2_1171706表中中a2字段的默认值分别被删除了name键和age键:

 id |        a1         |      a2      |                     a3

----+-------------------+--------------+----------------------------------------
----
  1 | {"name": "test1"} | {"id": 1001} | [null, "aaa"]
  2 | {"name": "test2"} | {"age": 30}  | ["true"]
  3 | {"name": "test3"} | {"id": 1003} | ["a", {"b": 1, "age": 30, "name": "John
"}]
(3 rows)

 id |        a1        |        a2        |      a3
----+------------------+------------------+---------------
  1 | {"name": "test"} | {"name": "John"} | ["null", "T"]
(1 row)

3、更新测试表中数据并查询。

update tb1_1171706 set a3=a3 #-'{-1,age}'::text[] where id=3;
select * from tb1_1171706 order by id;

查询结果为如下:

 id |        a1         |      a2      |               a3
----+-------------------+--------------+---------------------------------
  1 | {"name": "test1"} | {"id": 1001} | [null, "aaa"]
  2 | {"name": "test2"} | {"age": 30}  | ["true"]
  3 | {"name": "test3"} | {"id": 1003} | ["a", {"b": 1, "name": "John"}]
(3 rows)