json
和jsonb
操作符
操作符 | 右操作数类型 | 描述 | 例子 | 例子结果 |
|
| 获得 JSON 数组元素(索引从 0 开始,负整数从末尾开始计) |
|
|
|
| 通过键获得 JSON 对象域 |
|
|
|
| 以 |
|
|
|
| 以 |
|
|
|
| 获取在指定路径的 JSON 对象 |
|
|
|
| 以 |
|
|
额外的jsonb
操作符
操作符 | 右操作数类型 | 描述 | 例子 |
|
| 左边的 JSON 值是否在顶层包含右边的 JSON 路径/值项? |
|
|
| 左边的 JSON 路径/值项是否被包含在右边的 JSON 值的顶层? |
|
|
| 键/元素字符串是否存在于 JSON 值的顶层? |
|
|
| 这些数组字符串中的任何一个是否做为顶层键存在? |
|
|
| 是否所有这些数组字符串都作为顶层键存在? |
|
|
| 把两个 |
|
|
| 从左操作数删除键/值对或者string 元素。键/值对基于它们的键值来匹配。 |
|
|
| 从左操作数中删除多个键/值对或者string元素。键/值对基于它们的键值来匹配。 |
|
|
| 删除具有指定索引(负值表示倒数)的数组元素。如果 顶层容器不是数组则抛出一个错误。 |
|
|
| 删除具有指定路径的域或者元素(对于 JSON 数组,负值 表示倒数) |
|
JSON 创建函数
函数 | 描述 | 例子 | 例子结果 |
| 把该值返回为 |
|
|
| 把数组作为一个 JSON 数组返回。一个 PostgreSQL 多维数组会成为一个数组 的 JSON 数组。如果 |
|
|
| 把行作为一个 JSON 对象返回。如果 |
|
|
| 从一个可变参数列表构造一个可能包含异质类型的 JSON 数组。 |
|
|
| 从一个可变参数列表构造一个 JSON 对象。通过转换,该参数列表由交替 出现的键和值构成。 |
|
|
| 从一个文本数组构造一个 JSON 对象。该数组必须可以是具有偶数个成员的 一维数组(成员被当做交替出现的键/值对),或者是一个二维数组(每一个 内部数组刚好有 2 个元素,可以被看做是键/值对)。 |
|
|
|
|
|
|
JSON 处理
函数 | 返回值 | 描述 | 例子 | 例子结果 |
|
| 返回最外层 JSON 数组中的元素数量。 |
|
|
|
| 扩展最外层的 JSON 对象成为一组键/值对。 |
| key | value-----+------- a | "foo" b | "bar" |
|
| 扩展最外层的 JSON 对象成为一组键/值对。返回值将是 |
| key | value-----+------- a | foo b | bar |
|
| 返回由 |
|
|
|
| 以 |
|
|
|
| 返回最外层 JSON 对象中的键集合。 |
| json_object_keys------------------ f1 f2 |
|
| 扩展 |
| a | b | c---+-----------+------------- 1 | {2,"a b"} | (4,"a b c") |
|
| 扩展 |
| a | b---+--- 1 | 2 3 | 4 |
|
| 把一个 JSON 数组扩展成一个 JSON 值的集合。 |
| value----------- 1 true [2,false] |
|
| 把一个 JSON 数组扩展成一个 |
| value----------- foo bar |
|
| 把最外层的 JSON 值的类型作为一个文本字符串返回。可能的类型是: |
|
|
|
| 从一个 JSON 对象(见下文的注解)构建一个任意的记录。正如所有返回 |
| a | b | c | d | r---+---------+---------+---+--------------- 1 | [1,2,3] | {1,2,3} | | (123,"a b c") |
|
| 从一个 JSON 对象数组(见下文的注解)构建一个任意的记录集合。正如所有返回 |
| a | b---+----- 1 | foo 2 | |
|
| 返回 |
|
|
|
| 返回 |
|
|
|
| 返回被插入了 |
|
|
|
| 把 |
| [ { "f1": 1, "f2": null }, 2, null, 3] |
上面内容看起来比较晦涩,其实postgreSQL中json函数的操作在实际用的时候也是比较方便的。
发文笔记本没有安装数据库工具,公司不能访问外网,就不上代码了
我在csdn已经找到同僚分析的代码部分示例,相信你看过我转载的内容,就能对json有个新的认知,一通百通。理解这一个,其他的函数,自己尝试验证一下。
一、 -> 和 ->> :
-> 表示获取一个JSON数组元素,支持下标值(下标从0开始)、Key获取。->> 表示获取一个JSON对象字符串。
代码:
SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON -> 1;
结果:
{"b":2}
以上,::JSON 表示声明前面的字符串为一个JSON字符串对象,而且PostgreSQL中的JSON、JSONB对象 Key的声明必须是字符串 。同时,1表示获取JSON数组中下标值为1的JSON对象。
接下来,看下 ->> 的用法:
代码:
SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON ->> 1;
结果:
{"b":2}
以上,->> 的查询结果和 -> 对比不太直观,我们可以进一步验证。
代码:
SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON -> 1 -> 'b';
结果:
2
以上,我们可以看到首先我们使用下标的方式,获取JSON数组中下标值为1的JSON对象 {"b":2}。然后,我们通过Key的方式来获取这个JSON对象的Value值,结果是 2。
接下来,我们测试下 ->> 的方式来获取:
代码:
SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON ->> 1 -> 'b';
报错:
[SQL]SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON ->> 1 -> 'b';
[Err] 错误: 操作符不存在: text -> unknown
LINE 1: SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON ->> 1 -> 'b';
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
以上,可以看到错误提示操作符不存在,因为第一步查询出来的是一个字符串,不是JSON对象。当然,我们可以改造下这个查询语句:
代码:
SELECT ('[{"a":1},{"b":2},{"c":3}]'::JSON ->> 1)::JSON -> 'b';
结果:
2
以上,可以看到现在可以正确查询出结果,我们将第一步查询出来的字符串转成JSON对象,然后通过 Key 的方式来获取 Value。不过,这种查询方式相对于 -> 来说还是比较繁琐的。
二、 #> 和 #>> :
在前一步,我们在一个JSON数组中可以使用 -> 下标值的方式来获取一个JSON对象。但是,如果我们我们检索的不是JSON数组,而是一个JSON对象中的JSON对象。很显然,这种下标获取的方式不再适用。不过,我们可以使用下面的方式来获取。
#> 表示获取指定路径的一个JSON对象,#>>表示获取指定路径的一个JSON对象的字符串。
代码:
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #> '{b}'
结果:
{"ba":"b1","bb":"b2"}
以上,我们使用 #> 方式来获取一个JSON对象中的JSON对象。
注意:
在获取一个JSON对象时,除非是JSON数组中的下标,必须要要用 { } 将JSON对象的 Key 包裹起来,否则会抛出异常。
代码:
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON#>'b'
结果:
[SQL]SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON#>'b'
[Err] 错误: 有缺陷的数组常量:"b"
LINE 1: SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON#>'b'
^
DETAIL: 数组值必须以 "{" 或者维度信息开始。
同样的,我们还可以在 #> 的基础上,继续获取这个JSON对象内的相关信息。
代码:
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON#>'{b}'->'ba'
结果:
"b1"
以上,可以看到 -> 获取的是一个JSON对象。->>是获取的一个text 文本