更新时间:2024-09-02 GMT+08:00

JSON/JSONB操作符

表1 json和jsonb通用操作符

操作符

左操作数类型

右操作数类型

返回类型

描述

示例

->

Array-json(b)

int

json(b)

获得array-json元素。下标不存在返回空。

SELECT '[{"a":"foo"}, {"b":"bar"}, {"c":"baz"}]'::json->2;
  ?column?
-------------
 {"c":"baz"}
(1 row)

->

object-json(b)

text

json(b)

通过键获得值。不存在则返回空。

1
2
3
4
5
SELECT '{"a":{"b":"foo"}}'::json->'a';
  ?column?
-------------
 {"b":"foo"}
(1 row)

->>

Array-json(b)

int

text

获得array-json元素。下标不存在返回空。

1
2
3
4
5
SELECT '[{"a":"foo"}, {"b":"bar"}, {"c":"baz"}]'::json->>2;
  ?column?
-------------
 {"c":"baz"}
(1 row)

->>

object-json(b)

text

text

通过键获得值。不存在则返回空

1
2
3
4
5
SELECT '{"a":{"b":"foo"}}'::json->>'a';
  ?column?
-------------
 {"b":"foo"}
(1 row)

#>

container-json (b)

text[]

json

获取在指定路径的JSON对象,路径不存在则返回空。

说明:

GaussDB(DWS)对象标识符支持以符号"#"结尾,为避免a#>b解析过程出现歧义,因此操作符"#>"前后需要增加空格,否则解析报错。

1
2
3
4
5
SELECT '{"a":{"b":{"c":1}}}'::json #> '{a, b}';
 ?column?
----------
 {"c":1}
(1 row)

#>>

container-json (b)

text[]

text

获取在指定路径的JSON对象,路径不存在则返回空。

1
2
3
4
5
SELECT '{"a":{"b":{"c":1}}}'::json #>> '{a, b}';
 ?column?
----------
 {"c":1}
(1 row)
表2 jsonb支持的操作符

操作符

右操作类型

返回类型

描述

示例

=

jsonb

bool

判断两个jsonb的大小关系。同函数jsonb_eq

1
2
3
4
5
SELECT '{"a":{"b":{"c":1}}}'::jsonb = '{"a":{"b":{"c":1}}}'::jsonb;
 ?column?
----------
 t
(1 row)

<>

jsonb

bool

判断两个jsonb的大小关系。同函数jsonb_ne

1
2
3
4
5
SELECT '{"a":{"b":{"c":1}}}'::jsonb <> '{"a":{"b":{"c":1}}}'::jsonb;
 ?column?
----------
 f
(1 row)

<

jsonb

bool

判断两个jsonb的大小关系。同函数jsonb_lt

1
2
3
4
5
SELECT '{"a":{"b":{"c":2}}}'::jsonb < '{"a":{"b":{"c":1}}}'::jsonb;
 ?column?
----------
 f
(1 row)

>

jsonb

bool

判断两个jsonb的大小关系。同函数jsonb_gt。

1
2
3
4
5
SELECT '{"a":{"b":{"c":2}}}'::jsonb > '{"a":{"b":{"c":1}}}'::jsonb;
 ?column?
----------
 t
(1 row)

<=

jsonb

bool

判断两个jsonb的大小关系。同函数jsonb_le。

1
2
3
4
5
SELECT '{"a":{"b":{"c":2}}}'::jsonb <= '{"a":{"b":{"c":1}}}'::jsonb;
 ?column?
----------
 f
(1 row)

>=

jsonb

bool

判断两个jsonb的大小关系。同函数jsonb_ge。

1
2
3
4
5
SELECT '{"a":{"b":{"c":2}}}'::jsonb >= '{"a":{"b":{"c":1}}}'::jsonb;
 ?column?
----------
 t
(1 row)

?

text

bool

键/元素的字符串是否存在JSON值的顶层

1
2
3
4
5
SELECT '{"a":1, "b":2}'::jsonb ? 'b';
 ?column?
----------
 t
(1 row)

?|

text[]

bool

这些数组字符串中的任何一个是否作为顶层键存在。

1
2
3
4
5
SELECT '{"a":1, "b":2, "c":3, "d":4}'::jsonb ?| '{a, b, e}'::text[];
 ?column?
----------
 t
(1 row)

?&

text[]

bool

是否所有这些数组字符串都作为顶层键存在。

1
2
3
4
5
SELECT '{"a":1, "b":2, "c":3, "d":4}'::jsonb ?& '{a, b, c}'::text[];
 ?column?
----------
 t
(1 row)

<@

jsonb

bool

左边的JSON的所有项是否全部存在于右边JSON的顶层。

1
2
3
4
5
SELECT '{"b":3}'::jsonb <@ '{"a":{"b":{"c":2}}, "b":3}'::jsonb;
 ?column?
----------
 t
(1 row)

@>

jsonb

bool

左边的JSON的顶层是否包含右边JSON的顶层所有项。

1
2
3
4
5
SELECT '{"a":{"b":{"c":2}}, "b":3}'::jsonb @> '{"b":3}'::jsonb;
 ?column?
----------
 t
(1 row)

||

jsonb

jsonb

两个jsonb对象合并成一个。

1
2
3
4
5
SELECT '{"a":1, "b":2}'::jsonb || '{"c":3, "d":4}'::jsonb;
             ?column?
----------------------------------
 {"a": 1, "b": 2, "c": 3, "d": 4}
(1 row)

-

text

jsonb

删除jsonb对象删除指定的键值对。

1
2
3
4
5
SELECT '{"a":1, "b":2}'::jsonb - 'a';
 ?column?
----------
 {"b": 2}
(1 row)

-

text

jsonb

删除jsonb对象删除指定的键值对。

1
2
3
4
5
SELECT '{"a":1, "b":2, "c":3, "d":4}'::jsonb - '{a, b}'::text[];
     ?column?
------------------
 {"c": 3, "d": 4}
(1 row)

-

int

jsonb

删除jsonb数组中下标对应的元素。

1
2
3
4
5
SELECT '["a", "b", "c"]'::jsonb - 2;
  ?column?
------------
 ["a", "b"]
(1 row)

#-

text[]

jsonb

删除jsonb对象中路径对应的键值对。

1
2
3
4
5
SELECT '{"a":{"b":{"c":{"d":1}}}, "e":2, "f":3}'::jsonb #- '{a, b}'::text[];
         ?column?
---------------------------
 {"a": {}, "e": 2, "f": 3}
(1 row)