is_json_scalar(json) → boolean
判断 json
是否为标量(即 JSON 数字、JSON 字符串、true
、false
或 null
)。
示例 1
1
| SELECT is_json_scalar(JSON '"aaa"');
|
示例 2
1
| SELECT is_json_scalar(JSON '{"x": 1, "y": 2}');
|
json_array_contains(json, value) → boolean
判断 value
是否存在于 json
(一个包含 JSON 数组的字符串)中。
示例 1
判断整数 1 是否包含在 JSON 整数数组 [1, 2, 3] 中:
1
| SELECT json_array_contains(JSON '[1, 2, 3]', 1);
|
示例 2
判断字符串 1 是否包含在 JSON 整数数组 [1, 2, 3] 中:
1
| SELECT json_array_contains(JSON '[1, 2, 3]', '1');
|
json_array_get(json_array, index) → json
返回 json_array
中指定下标的元素。下标从 0 开始。
警告:这个函数的语义是错误的。如果提取的元素是一个字符串,它会被转换成一个无效的 JSON 值,该值没有正确地加上引号(该值不会被引号包围,任何内部的引号也不会被转义)。
我们不建议使用这个函数。它无法在不影响现有用法的情况下修复,并且在未来的版本中可能会被删除。
示例 1
返回 JSON 数组 [“a”, [3, 9, “D”] 下标为 0 的元素。由于下标为 0 的元素是一个字符串,会被转换成一个无效的 JSON 值,即该值没有被引号包围(正确的结果应该是包含引号的 "a"
):
1
| SELECT json_array_get('["a", [3, 9, "D"], "c"]', 0);
|
为更好地说明该函数存在的问题,我们可以将提取出来的结果(JSON 字符串类型)转换为 VARCHAR
,此时会报 Cannot cast ‘a’ to varchar 的错误信息:
1
| SELECT CAST(json_array_get('["a", [3, 9, "D"], "c"]', 0) AS VARCHAR);
|
1
| failed: Cannot cast 'a' to varchar
|
正确的 JSON 字符串类型(有被引号包围)转为 VARCHAR
如下:
1
| SELECT CAST(JSON '"a"' AS VARCHAR);
|
示例 2
返回 JSON 数组 [“a”, [3, 9, “D”] 下标为 1 的元素:
1
| SELECT json_array_get('["a", [3, 9, "D"], "c"]', 1);
|
1 2 3 4
| _col0
[3,9,"D"] (1 row)
|
示例 3
该函数也支持负数索引,以获取从数组的末尾索引元素:
1
| SELECT json_array_get('["a", [3, 9, "D"], "c"]', -1);
|
示例 4
如果指定索引的元素不存在,该函数返回 null。如以下查询 SQL 语句均返回 null:
1 2 3
| SELECT json_array_get('[]', 0); SELECT json_array_get('["a", "b", "c"]', 10); SELECT json_array_get('["c", "b", "a"]', -10);
|
返回结果:
json_array_length(json) → bigint
返回 json
(一个包含 JSON 数组的字符串)的数组长度。
示例
1
| SELECT json_array_length('[1, 2, 3]');
|
在 json
(一个包含 JSON 的字符串)上计算类似 JSONPath 的表达式 json_path
,并将结果作为 JSON 返回。
示例 1
1
| SELECT json_extract('{"agent":{"version":"8.6.2","name":"Bai5iewe-103"},"log":{"file":{"path":"/etc/nginx/logs/access.log"},"offset":19991212}}', '$.log.file.path');
|
1 2 3 4
| _col0
"/etc/nginx/logs/access.log" (1 row)
|
示例 2
1
| SELECT json_extract('{"agent":{"version":"8.6.2","name":"Bai5iewe-103"},"log":{"file":{"path":"/etc/nginx/logs/access.log"},"offset":19991212}}', '$.log.file');
|
1 2 3 4
| _col0
{"path":"/etc/nginx/logs/access.log"} (1 row)
|
与 json_extract()
类似,但将结果值作为字符串返回(而不是编码为 JSON)。json_path
所引用的值必须是一个标量(布尔值、数字或字符串)。
示例 1
json_path
所引用的值是一个字符串:
1 2
| SELECT json_extract_scalar('{"agent":{"version":"8.6.2","name":"Bai5iewe-103"},"log":{"file":{"path":"/etc/nginx/logs/access.log "},"offset":19991212}}', '$.log.file.path');
|
1 2 3 4
| _col0
/etc/nginx/logs/access.log (1 row)
|
示例 2
当 json_path
所引用的值是一个 JSON 对象,返回结果为 NULL:
1
| SELECT json_extract_scalar('{"agent":{"version":"8.6.2","name":"Bai5iewe-103"},"log":{"file":{"path":"/etc/nginx/logs/access.log"},"offset":19991212}}', '$.log.file');
|
返回从输入的 JSON 值序列化的 JSON 文本。这是 json_parse()
的逆函数。
示例 1
1
| SELECT json_format(JSON '[1, 2, 3]');
|
1 2 3 4
| _col0
[1,2,3] (1 row)
|
示例 2
1
| SELECT json_format(JSON '"a"');
|
注意:json_format()
和 CAST(json AS VARCHAR)
有完全不同的语义。
json_format()
将输入的 JSON 值序列化为符合 RFC 7159 标准的 JSON 文本。JSON 值可以是 JSON 对象、JSON 数组、JSON 字符串、JSON 数字、true
、false
或 null
。
序列化 JSON 对象:
1
| SELECT json_format(JSON '{"a": 1, "b": 2}');
|
1 2 3 4
| _col0
{"a":1,"b":2} (1 row)
|
序列化 JSON 数组:
1
| SELECT json_format(JSON '[1, 2, 3]');
|
1 2 3 4
| _col0
[1,2,3] (1 row)
|
序列化 JSON 字符串:
1
| SELECT json_format(JSON '"abc"');
|
序列化 JSON 数字:
1
| SELECT json_format(JSON '42');
|
序列化布尔值 true
:
1
| SELECT json_format(JSON 'true');
|
序列化 null
:
1
| SELECT json_format(JSON 'null');
|
而 CAST(json AS VARCHAR)
将 JSON 值转换为对应的 SQL VARCHAR 值。对于 JSON 字符串、JSON 数字、true
、false
或 null
,转换行为与相应的 SQL 类型相同。JSON 对象和 JSON 数组不能转换为 VARCHAR
。
将 JSON 对象转换为对应的 SQL VARCHAR 值:
1
| SELECT CAST(JSON '{"a": 1, "b": 2}' AS VARCHAR);
|
1
| Query failed: Cannot cast '{"a":1,"b":2}' to varchar
|
将 JSON 数组转换为对应的 SQL VARCHAR 值
1
| SELECT CAST(JSON '[1, 2, 3]' AS VARCHAR);
|
1
| Query failed: Cannot cast '[1,2,3]' to varchar
|
将 JSON 字符串转换为对应的 SQL VARCHAR
值,注意,返回结果中的 abc 没有带双引号:
1
| SELECT CAST(JSON '"abc"' AS VARCHAR);
|
将 JSON 数字转换为对应的 SQL VARCHAR 值:
1
| SELECT CAST(JSON '42' AS VARCHAR);
|
将 JSON 布尔值 true 转换为对应的 SQL VARCHAR 值
1
| SELECT CAST(JSON 'true' AS VARCHAR);
|
将 JSON null 值转换为对应的 SQL VARCHAR 值:
1
| SELECT CAST(JSON 'null' AS VARCHAR);
|
json_parse(string) → json
返回从输入的 JSON 文本反序列化的 JSON 值。这是 json_format()
的逆函数。
示例 1
1
| SELECT json_parse('[1, 2, 3]');
|
1 2 3 4
| _col0
[1,2,3] (1 row)
|
示例 2
1
| SELECT json_parse('"abc"');
|
注意:json_parse()
和 CAST(string AS json)
有完全不同的语义。
json_parse()
将符合 RFC 7159 标准的 JSON 文本反序列化为 JSON 值。JSON 值可以是 JSON 对象、JSON 数组、JSON 字符串、JSON 数字、true
、false
或 null
。
示例 3
1
| SELECT json_parse('not_json');
|
1
| Query failed: Cannot convert 'not_json' to JSON
|
示例 4
1
| SELECT json_parse('{"a": 1, "b": 2}');
|
1 2 3 4
| _col0
{"a":1,"b":2} (1 row)
|
示例 5
1
| SELECT json_parse('[1, 2, 3]');
|
1 2 3 4
| _col0
[1,2,3] (1 row)
|
示例 6
1
| SELECT json_parse('"abc"');
|
示例 7
1
| SELECT json_parse('42');
|
示例 8
1
| SELECT json_parse('true');
|
示例 9
1
| SELECT json_parse('null');
|
而 CAST(string AS JSON)
函数将任何 VARCHAR
类型的输入值转换为 JSON 字符串格式。
示例 10
1
| SELECT CAST('not_json' AS JSON);
|
1 2 3 4
| _col0
"not_json" (1 row)
|
示例 11
1
| SELECT CAST('{"a": 1, "b": 2}' AS JSON);
|
1 2 3 4
| _col0
"{\"a\": 1, \"b\": 2}" (1 row)
|
示例 12
1
| SELECT CAST('[1, 2, 3]' AS JSON);
|
1 2 3 4
| _col0
"[1, 2, 3]" (1 row)
|
示例 13
1
| SELECT CAST('"abc"' AS JSON);
|
1 2 3 4
| _col0
"\"abc\"" (1 row)
|
示例 14
1
| SELECT CAST('42' AS JSON);
|
示例 15
1
| SELECT CAST('true' AS JSON);
|
示例 16
1
| SELECT CAST('null' AS JSON);
|
json_size(json, json_path) → bigint
与 json_extract()
类似,但返回值的大小。对于对象或数组,大小是成员的数量,标量值的大小是零。
示例 1
返回对象的成员数量:
1
| SELECT json_size('{"x": {"a": 1, "b": 2}}', '$.x');
|
示例 2
返回数组的成员数量:
1
| SELECT json_size('{"x": [1, 2, 3]}', '$.x');
|
示例 3
返回标量的成员数量:
1
| SELECT json_size('{"x": {"a": 1, "b": 2}}', '$.x.a');
|
(END)