
# JSON/JSONB函数和操作符
JSON/JSONB数据类型参考[JSON/JSONB类型](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0335.html#ZH-CN_TOPIC_0000002559105781)，操作符如[表1 JSON/JSONB通用操作符]和[表2 JSONB额外支持操作符]所示。
 表1JSON/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) | 通过键获得值。不存在则返回空。            | ``` SELECT '{"a": {"b":"foo"}}'::json->'a'; ?column? ------------- {"b":"foo"} (1 row) ```                  |
| -\>\> | Array-json(b)      | int      | text    | 获得JSON 数组元素。下标不存在返回空。      | ``` SELECT '[1,2,3]'::json->>2; ?column? ---------- 3 (1 row) ```                                           |
| -\>\> | object-json(b)     | text     | text    | 通过键获得值。不存在则返回空。            | ``` SELECT '{"a":1,"b":2}'::json->>'b'; ?column? ---------- 2 (1 row) ```                                   |
| #\>   | container-json (b) | text\[\] | json(b) | 获取在指定路径的JSON 对象，路径不存在则返回空。 | ``` SELECT '{"a": {"b":{"c": "foo"}}}'::json #>'{a,b}'; ?column? -------------- {"c": "foo"} (1 row) ```    |
| #\>\> | container-json (b) | text\[\] | text    | 获取在指定路径的JSON 对象，路径不存在则返回空。 | ``` SELECT '{"a":[1,2,3],"b":[4,5,6]}'::json #>>'{a,2}'; ?column? ---------- 3 (1 row) ```                  |
   
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/caution_3.0-zh-cn.png)
对于 #\> 和 #\>\> 操作符，当给出的路径无法查找到数据时，不会报错，会返回空。
 表2JSONB额外支持操作符 
| 操作符  | 右操作数类型   | 描述                           | 例子                                                   |
|:---|:---|:---|:---|
| @\>  | jsonb    | 左边的JSON的顶层是否包含右边JSON的顶层所有项。  | '{"a":1, "b":2}'::jsonb @\> '{"b":2}'::jsonb         |
| \<@  | jsonb    | 左边的JSON的所有项是否全部存在于右边JSON的顶层。 | '{"b":2}'::jsonb \<@ '{"a":1, "b":2}'::jsonb         |
| ?    | text     | 键/元素的字符串是否存在于JSON 值的顶层。      | '{"a":1, "b":2}'::jsonb ? 'b'                        |
| ?\|  | text\[\] | 这些数组字符串中的任何一个是否作为顶层键存在。      | '{"a":1, "b":2, "c":3}'::jsonb ?\| array\['b', 'c'\] |
| ?\&  | text\[\] | 是否所有这些数组字符串都作为顶层键存在。         | '\["a", "b"\]'::jsonb ?\& array\['a', 'b'\]          |
| =    | jsonb    | 判断两个jsonb的大小关系，同函数jsonb_eq。  | /                                                    |
| \<\> | jsonb    | 判断两个jsonb的大小关系，同函数jsonb_ne。  | /                                                    |
| \<   | jsonb    | 判断两个jsonb的大小关系，同函数jsonb_lt。  | /                                                    |
| \>   | jsonb    | 判断两个jsonb的大小关系，同函数jsonb_gt。  | /                                                    |
| \<=  | jsonb    | 判断两个jsonb的大小关系，同函数jsonb_le。  | /                                                    |
| \>=  | jsonb    | 判断两个jsonb的大小关系，同函数jsonb_ge。  | /                                                    |
   
