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')))
);
翻譯來源:https://elephantdolphin.blogspot.com/2020/07/jsonvalue-now-in-mysql-8021.html