【presto】json函数

本文详细介绍了Presto中如何将不同数据类型转换为JSON,以及从JSON转换回各种数据类型。此外,还展示了JSON函数的使用,如json_array_contains、json_array_get、json_extract和json_size等,帮助处理和检查JSON数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转换为JSON
支持由BOOLEAN, TINYINT, SMALLINT, INTEGER, BIGINT, REAL, DOUBLE或VARCHAR转换。
当ARRAY中的元素是以上类型时支持转换。
当map的key的类型是VARCHAR,value类型是以上类型时支持转换。

SELECT CAST(NULL AS JSON); -- NULL
SELECT CAST(1 AS JSON); -- JSON '1'
SELECT CAST(9223372036854775807 AS JSON); -- JSON '9223372036854775807'
SELECT CAST('abc' AS JSON); -- JSON '"abc"'
SELECT CAST(true AS JSON); -- JSON 'true'
SELECT CAST(1.234 AS JSON); -- JSON '1.234'
SELECT CAST(ARRAY[1, 23, 456] AS JSON); -- JSON '[1,23,456]'
SELECT CAST(ARRAY[1, NULL, 456] AS JSON); -- JSON '[1,null,456]'
SELECT CAST(ARRAY[ARRAY[1, 23], ARRAY[456]] AS JSON); -- JSON '[[1,23],[456]]'
SELECT CAST(MAP(ARRAY['k1', 'k2', 'k3'], ARRAY[1, 23, 456]) AS JSON); -- JSON '{"k1":1,"k2":23,"k3":456}'

请注意,从NULL转换为JSON并不是直接转换的。 从独立的NULL转换将产生一个SQL NULL而不是JSON’null’。 但是,当从数组或包含NULL的映射转换时,生成的JSON将具有null。

从JSON转换为其他格式
支持转换为BOOLEAN, TINYINT, SMALLINT, INTEGER, BIGINT, REAL, DOUBLE或VARCHAR。
当ARRAY中的元素是以上类型时支持转换。
当map的key的类型是VARCHAR,value类型是以上类型时支持转换。

SELECT CAST(JSON 'null' AS VARCHAR); -- NULL
SELECT CAST(JSON '1' AS INTEGER); -- 1
SELECT CAST(JSON '9223372036854775807' AS BIGINT); -- 9223372036854775807
SELECT CAST(JSON '"abc"' AS VARCHAR); -- abc
SELECT CAST(JSON 'true' AS BOOLEAN); -- true
SELECT CAST(JSON '1.234' AS DOUBLE); -- 1.234
SELECT CAST(JSON '[1,23,456]' AS ARRAY(INTEGER)); -- [1, 23, 456]
SELECT CAST(JSON '[1,null,456]' AS ARRAY(INTEGER)); -- [1, NULL, 456]
SELECT CAST(JSON '[[1,23],[456]]' AS ARRAY(ARRAY(INTEGER))); -- [[1, 23], [456]]
SELECT CAST(JSON '{"k1":1,"k2":23,"k3":456}' AS MAP(VARCHAR, INTEGER)); -- {k1=1, k2=23, k3=456}

JSON数组可以具有混合元素类型,JSON映射可以具有混合值类型。 这使得在某些情况下无法将其转换为SQL数组和映射。 为了解决这个问题,Presto支持部分转换数组和映射:

SELECT CAST(JSON '[[1, 23], 456]' AS ARRAY(JSON)); -- [JSON '[1,23]', JSON '456']
SELECT CAST(JSON '{"k1": [1, 23], "k2": 456}' AS MAP(VARCHAR, JSON)); -- {k1 = JSON '[1,23]', k2 = JSON '456'}
SELECT CAST(JSON '[null]' AS ARRAY(JSON)); -- [JSON 'null']

JSON函数

json_array_contains(json, value) → boolean
确定json中是否存在值(包含JSON数组的字符串)

SELECT json_array_contains('[1, 2, 3]', 2);

json_array_get(json_array, index) → varchar
将指定index处的元素返回到json数组中,index从0开始计数

SELECT json_array_get('["a", "b", "c"]', 0); -- 'a'
SELECT json_array_get('["a", "b", "c"]', 1); -- 'b'

此函数还支持通过负的index从数组末尾读取元素索引

SELECT json_array_get('["c", "b", "a"]', -1); -- 'a'
SELECT json_array_get('["c", "b", "a"]', -2); -- 'b'

如果指定索引处的元素不存在,则函数返回null:

SELECT json_array_get('[]', 0); -- null
SELECT json_array_get('["a", "b", "c"]', 10); -- null
SELECT json_array_get('["c", "b", "a"]', -10); -- null

json_array_length(json) → bigint
返回json的数组长度(包含JSON数组的字符串)

SELECT json_array_length('[1, 2, 3]');

json_extract(json, json_path) → json
评估json上的JSONPath表达式json_path(包含JSON的字符串),并将结果作为JSON字符串返回:

SELECT json_extract(json, '$.store.book');

json_extract_scalar(json, json_path) → varchar
和json_extract()类似,但返回结果值作为一个字符串(而不是编码为JSON)。 json_path引用的值必须是scalar(boolean, number or string):

SELECT json_extract_scalar('[1, 2, 3]', '$[2]');
SELECT json_extract_scalar(json, '$.store.book[0].author');

json_format(json) → varchar
将json作为字符串返回

SELECT json_format(JSON '[1, 2, 3]'); -- '[1,2,3]'
SELECT json_format(JSON '"a"'); -- '"a"'

json_parse(string) → json
解析字符串作为json

SELECT json_parse('[1, 2, 3]'); -- JSON '[1,2,3]'
SELECT json_parse('"a"'); -- JSON '"a"'

json_size(json, json_path) → bigint
跟json_extract()一样,但返回size的大小。对于对象或数组,大小是成员数,scalar 的大小为零:

SELECT json_size('{"x": {"a": 1, "b": 2}}', '$.x'); -- 2
SELECT json_size('{"x": [1, 2, 3]}', '$.x'); -- 3
SELECT json_size('{"x": {"a": 1, "b": 2}}', '$.x.a'); -- 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值