MySQL 8.0.21发布了,其中一个新特性是JSON_VALUE()函数。主要的动机是简化JSON数据的索引创建,但是还有更多的原因。
JSON_VALUE()在JSON数据中查找指定的标量JSON值,并将其作为SQL值返回。
例子,我将使用mysql_x示例数据库数据作为示例。让我们从life expectancy数据开始。
SELECT JSON_EXTRACT(doc, "$.demographics.LifeExpectancy") AS raw
FROM countryinfo
LIMIT 4;
+--------------------+
| raw |
+--------------------+
| 78.4000015258789 |
| 45.900001525878906 |
| 38.29999923706055 |
| 76.0999984741211 |
+--------------------+
这是一个很棒的信息,但是用眼睛看起来不是那么舒服
我们可以使用JSON_VALUE()使它对我们看起来说更容易一些
SELECT
JSON_VALUE(doc, "$.demographics.LifeExpectancy" RETURNING DECIMAL(6,2)) AS trimmed FROM countryinfo
LIMIT 4;
+---------+
| trimmed |
+---------+
| 78.40 |
| 45.90 |
| 38.30 |
| 76.10 |
+---------+
它在WHERE子句中非常有用。在本例中没有RETURNING子句。
SELECT doc->"$.Name"
FROM countryinfo
WHERE JSON_VALUE(doc, "$.demographics.LifeExpectancy"
RETURNING DECIMAL(6,3)) > 80.1;
+---------------+
| doc->"$.Name" |
+---------------+
| "Andorra" |
| "Japan" |
| "Macao" |
| "San Marino" |
+---------------+
可选的RETURN子句将您的数据转换为FLOAT、DOUBLE、DECIMAL、SIGNED、
UNSIGNED, DATE, TIME, DATETIME, CHAR或JSON, 甚至还有on empty和on error子句。
SELECT JSON_VALUE('{firstname:"John"}', '$.lastname'
DEFAULT 'No last name found' ON ERROR) AS "Last Name";
+--------------------+
| Last Name |
+--------------------+
| No last name found |
+--------------------+
当然,它可以用来帮助定义索引。
CREATE TABLE xdemo (j JSON,
x INTEGER,
key((json_value(j, '$.id')))
);