MariaDB JSON_VALUE() vs JSON_QUERY(): 有什么区别?

发布于

在MariaDB中,函数和函数做类似的事情——它们从JSON文档返回数据。JSON_VALUE()JSON_QUERY()

那么有什么区别呢?

主要区别在于返回标量值,而返回数组和对象。JSON_VALUE()``JSON_QUERY()

定义

给定一个 JSON 文档,每个函数执行以下操作:

  • JSON_VALUE()返回路径指定的标量。
  • JSON_QUERY()返回由路径指定的对象或数组。

我的理解是,由于SQL标准,它以这种方式工作。

如果这给您带来了问题,您可能会发现该函数更有用。JSON_EXTRACT()

标量

下面是一个示例,演示当我们尝试使用这两个函数从 JSON 文档中提取标量时会发生什么。

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.name') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.name') AS JSON_QUERY;

输出:

+------------+------------+
| JSON_VALUE | JSON_QUERY |
+------------+------------+
| Rufus      | NULL       |
+------------+------------+

JSON_VALUE()按预期返回标量,但返回 。这是意料之中的,因为只返回数组和对象。JSON_QUERY()``NULL``JSON_QUERY()

如果我们尝试从数组返回标量数据,结果相同:

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.awards[0]') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.awards[0]') AS JSON_QUERY;

输出:

+------------+------------+
| JSON_VALUE | JSON_QUERY |
+------------+------------+
| Top Dog    | NULL       |
+------------+------------+

对象

以下是当我们尝试使用这两个函数返回整个对象时发生的情况:

SET @json_document = '{ "name" : "Rufus" }';

SELECT 
    JSON_VALUE(@json_document, '$') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$') AS JSON_QUERY;

输出:

+------------+----------------------+
| JSON_VALUE | JSON_QUERY           |
+------------+----------------------+
| NULL       | { "name" : "Rufus" } |
+------------+----------------------+

这次是功能成功了。JSON_QUERY()

阵 列

当我们尝试使用这两个函数返回整个数组时,会发生什么:

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.awards') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.awards') AS JSON_QUERY;

输出:

+------------+------------------------------------------+
| JSON_VALUE | JSON_QUERY                               |
+------------+------------------------------------------+
| NULL       | [ "Top Dog", "Best Dog", "Biggest Dog" ] |
+------------+------------------------------------------+

同样,函数成功。JSON_QUERY()

但是,当我们使用数组通配符运算符从数组中选择所有标量元素时,这两个函数都不会成功。在这种情况下,来救援:JSON_EXTRACT()

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.awards[*]') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.awards[*]') AS JSON_QUERY,
    JSON_EXTRACT(@json_document, '$.awards[*]') AS JSON_EXTRACT;

输出:

+------------+------------+----------------------------------------+
| JSON_VALUE | JSON_QUERY | JSON_EXTRACT                           |
+------------+------------+----------------------------------------+
| Top Dog    | NULL       | ["Top Dog", "Best Dog", "Biggest Dog"] |
+------------+------------+----------------------------------------+

但是,如果数组的元素是数组或对象,则返回它们:JSON_QUERY()

SET @json_document = '
    { 
        "name" : "Rufus",
        "scores" : [ [1, 2, 3], [8, 9], { "a" : 1 } ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.scores') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.scores') AS JSON_QUERY;

输出:

+------------+------------------------------------+
| JSON_VALUE | JSON_QUERY                         |
+------------+------------------------------------+
| NULL       | [ [1, 2, 3], [8, 9], { "a" : 1 } ] |
+------------+------------------------------------+