JSON操作符
->操作符
描述:查询JSON中指定位置的数据,返回带引号的查询结果。
示例:
-- 创建数据表。
m_db=# CREATE TABLE muscleape
(
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
category JSON,
tags JSON,
PRIMARY KEY (id)
);
-- 插入数据。
m_db=# INSERT INTO muscleape (category, tags) VALUES ('{"id": 1,"name": "muscleape"}','[1,2,3]');
m_db=# INSERT INTO muscleape (category, tags) VALUES (JSON_OBJECT("id",2,"name","muscleape_q"),JSON_ARRAY(1,3,5));
-- 查询表。
m_db=# SELECT * FROM muscleape;
id | category | tags
----+----------------------------------+-----------
1 | {"id": 1, "name": "muscleape"} | [1, 2, 3]
2 | {"id": 2, "name": "muscleape_q"} | [1, 3, 5]
(2 rows)
-- 查询json中的数据。
m_db=# SELECT id,category->'$.id',category->'$.name',tags->'$[0]',tags->'$[2]' FROM muscleape;
id | ?column? | ?column? | ?column? | ?column?
----+----------+---------------+----------+----------
1 | 1 | "muscleape" | 1 | 3
2 | 2 | "muscleape_q" | 1 | 5
(2 rows)
-- 删除表。
m_db=# DROP TABLE muscleape;
如果->操作符左侧的数据执行了::JSON强制类型转换,其实际转换的JSON类型与GUC参数m_format_behavior_compat_options兼容性选项是否设置了cast_as_new_json有关。
->>操作符
描述:查询JSON中指定位置的数据,返回不带引号的查询结果。
示例:
-- 创建数据表。
m_db=# CREATE TABLE muscleape
(
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
category JSON,
tags JSON,
PRIMARY KEY (id)
);
-- 插入数据。
m_db=# INSERT INTO muscleape (category, tags) VALUES ('{"id": 1,"name": "muscleape"}','[1,2,3]');
m_db=# INSERT INTO muscleape (category, tags) VALUES (JSON_OBJECT("id",2,"name","muscleape_q"),JSON_ARRAY(1,3,5));
-- 查询表。
m_db=# SELECT * FROM muscleape;
id | category | tags
----+----------------------------------+-----------
1 | {"id": 1, "name": "muscleape"} | [1, 2, 3]
2 | {"id": 2, "name": "muscleape_q"} | [1, 3, 5]
(2 rows)
-- 查询json中的数据。
m_db=# SELECT id,category->>'$.id',category->>'$.name',tags->>'$[0]',tags->>'$[2]' FROM muscleape;
id | ?column? | ?column? | ?column? | ?column?
----+----------+-------------+----------+----------
1 | 1 | muscleape | 1 | 3
2 | 2 | muscleape_q | 1 | 5
(2 rows)
-- 删除表。
m_db=# DROP TABLE muscleape;
如果->>操作符左侧的数据执行了::JSON强制类型转换,其实际转换的JSON类型与GUC参数m_format_behavior_compat_options兼容性选项是否设置了cast_as_new_json有关。
比较操作符
描述:JSON类型之间的比较操作符支持=、<=>、<>、<、<=、>和>=运算,返回结果为true或false。如果是JSON类型和其他类型进行比较,会将其他类型转换为JSON类型后再进行比较。
JSON类型的排序规则:
- 首先比较JSON数据的类型,OPAQUE > TIMESTAMP = DATETIME > TIME > DATE > BOOL > 数组 > 对象 > 字符串类型 > DOUBLE = UINT = INT = DECIMAL > NULL,结果相等则比较内容。
- 标量之间比较值的大小,OPAQUE先进行类型之间的比较,TYPE_STRING > TYPE_VAR_STRING > TYPE_BLOB > TYPE_BIT > TYPE_VARCHAR > TYPE_YEAR,类型相同时依次比较每个字节的大小。
- 数组之间依次比较元素的大小,当其中一个数组的元素比较完之后,则元素个数多的大。对象之间比较长度,长度相等则依次比较每个键值对,先比较键key,再比较值value。
示例:
mydb=# SELECT CAST(TIME'12:12:00' AS JSON) < CAST(BINARY'100100100' AS JSON);
?column?
----------
t
(1 row)
mydb=# SELECT CAST('{"jsnid": [true, "abc"], "tag": {"ab": 1, "b": null, "a": 2}}' AS JSON) > CAST('[1, 2, "json", null, [[]], {}]' AS JSON);
?column?
----------
f
(1 row)
mydb=# SELECT CAST('true' AS JSON) <= CAST('-1.5e2' AS JSON);
?column?
----------
f
(1 row)
mydb=# SELECT CAST('"abc"' AS JSON) >= CAST('null' AS JSON);
?column?
----------
t
(1 row)
mydb=# SELECT CAST('0.5e3' AS JSON) = CAST('500' AS JSON);
?column?
----------
t
(1 row)
算术运算符
JSON类型与任意类型的运算操作符支持-、+、*及/运算,返回DOUBLE类型。对于数字类型标量、布尔类型标量和字符串类型标量的JSON类型数据,会转换为相应的DOUBLE类型后进行计算,其他类型的JSON数据无法正常转换。
示例:
mydb=# SELECT CAST('true' AS JSON) + CAST('1.5e2' AS JSON);
?column?
----------
151
(1 row)
mydb=# SELECT CAST('"123"' AS JSON) - 1;
?column?
----------
122
(1 row)
mydb=# SELECT CAST('5' AS JSON) / 2;
?column?
----------
2.5000
(1 row)
mydb=# SELECT CAST('3' AS JSON) * 3.33;
?column?
----------
9.99
(1 row)