#-操作符
功能描述
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)