MySQL JSON_VALUE() 函数使用指南
MySQL JSON_VALUE()
函数从一个指定的 JSON 文档中提取指定路径的值并返回。
JSON_VALUE()
语法
这里是 MySQL JSON_VALUE()
的语法:
JSON_VALUE(json, path [RETURNING type] [{NULL | ERROR | DEFAULT value} ON EMPTY] [{NULL | ERROR | DEFAULT value} ON ERROR])
参数
-
json
必需的。一个 JSON 文档。
-
path
必需的。一个路径表达式。
-
RETURNING type
可选的。他决定了返回值的类型。您可以使用下面值中的一个:
FLOAT
DOUBLE
DECIMAL
SIGNED
UNSIGNED
DATE
TIME
DATETIME
YEAR
(MySQL 8.0.22 and later)CHAR
JSON
-
{NULL | ERROR | DEFAULT value} ON EMPTY
可选的。如果指定了,它决定了指定路径下没有数据的返回值:
NULL ON EMPTY
: 如果指定路径下没有数据,JSON_VALUE()
函数将返回NULL
,这是默认的行为。DEFAULT value ON EMPTY
: 如果指定路径下没有数据,JSON_VALUE()
函数将返回value
。ERROR ON EMPTY
: 如果指定路径下没有数据,JSON_VALUE()
函数将抛出一个错误。
-
{NULL | ERROR | DEFAULT value} ON ERROR
可选的。如果指定了,它决定了处理错误的逻辑:
NULL ON ERROR
: 如果有错误,JSON_VALUE()
函数将返回NULL
,这是默认的行为。DEFAULT value ON ERROR
: 如果有错误,JSON_VALUE()
函数将返回value
。ERROR ON ERROR
: 如果有错误,JSON_VALUE()
函数将抛出一个错误。
返回值
如果 JSON 文档在指定的路径上有值,JSON_VALUE()
函数返回路径上的数据。除非您使用 RETURNING type
子句,否则 JSON_VALUE()
函数默认将找到的数据作为字符串返回。
JSON_VALUE()
函数将在以下情况下返回错误:
- 如果参数
json
不是有效的 JSON 文档,MySQL 将会给出错误。您可以使用JSON_VALID()
验证 JSON 文档的有效性。 - 如果参数
path
不是有效的路径表达式, MySQL 将会给出错误。
JSON_VALUE()
示例
让我们先创建一个 JSON 文档以供以下的例子使用:
SET @json = '[
{
"name": "Tim",
"age": 20,
"amount": 123.456,
"note": "He is perfect."
},
{
"name": "Tom",
"age": 20,
"amount": 456.1
}
]';
这里, 我们创建了一个 JSON 数组,它包含两个用户信息。
返回第一个用户的年龄
SELECT JSON_VALUE(@json, '$[0].age');
+-------------------------------+
| JSON_VALUE(@json, '$[0].age') |
+-------------------------------+
| 20 |
+-------------------------------+
返回第二个用户的金额
SELECT JSON_VALUE(@json, '$[1].amount');
+----------------------------------+
| JSON_VALUE(@json, '$[1].amount') |
+----------------------------------+
| 456.1 |
+----------------------------------+
如果您想要返回的数据像第一位用户的金额那样具有 3 位小数位,您可以使用 RETURNING DECIMAL(10,3)
子句:
SELECT JSON_VALUE(@json, '$[1].amount' RETURNING DECIMAL(9,3));
+---------------------------------------------------------+
| JSON_VALUE(@json, '$[1].amount' RETURNING DECIMAL(9,3)) |
+---------------------------------------------------------+
| 456.100 |
+---------------------------------------------------------+
默认值
如果指定的路径上没有数据,您可以使用 ON EMPTY
子句设定默认值:
SELECT
JSON_VALUE(@json, '$[0].note' DEFAULT 'Nothing' ON EMPTY) AS `$[0].note`,
JSON_VALUE(@json, '$[1].note' DEFAULT 'Nothing' ON EMPTY) AS `$[1].note`;
+----------------+-----------+
| $[0].note | $[1].note |
+----------------+-----------+
| He is perfect. | Nothing |
+----------------+-----------+