Trong MariaDB, JSON_VALUE()
hàm và JSON_QUERY()
hàm làm những việc tương tự - chúng trả về dữ liệu từ tài liệu JSON.
Vậy sự khác biệt là gì?
Sự khác biệt chính là JSON_VALUE()
trả về giá trị vô hướng, trong khi JSON_QUERY()
trả về mảng và đối tượng.
Định nghĩa
Với một tài liệu JSON, mỗi hàm thực hiện như sau:
-
JSON_VALUE()
trả về đại lượng vô hướng được chỉ định bởi đường dẫn. -
JSON_QUERY()
trả về một đối tượng hoặc mảng được chỉ định bởi đường dẫn.
Sự hiểu biết của tôi là nó hoạt động theo cách này do tiêu chuẩn SQL.
Nếu điều này gây ra sự cố cho bạn, bạn có thể tìm thấy JSON_EXTRACT()
chức năng hữu ích hơn.
Vô hướng
Dưới đây là một ví dụ để chứng minh điều gì sẽ xảy ra khi chúng tôi cố gắng sử dụng cả hai hàm để trích xuất một đại lượng từ tài liệu 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;
Kết quả:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
đã trả về vô hướng như mong đợi, nhưng JSON_QUERY()
trả về NULL
. Điều này được mong đợi, bởi vì JSON_QUERY()
chỉ trả về mảng và đối tượng.
Đó là kết quả tương tự nếu chúng tôi cố gắng trả về dữ liệu vô hướng từ mảng:
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;
Kết quả:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Đối tượng
Đây là những gì sẽ xảy ra khi chúng tôi cố gắng sử dụng cả hai hàm để trả về một đối tượng toàn bộ:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Kết quả:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Lần này là JSON_QUERY()
chức năng thành công.
Mảng
Đây là những gì sẽ xảy ra khi chúng tôi cố gắng sử dụng cả hai hàm để trả về toàn bộ một mảng:
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;
Kết quả:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
Xin nhắc lại, JSON_QUERY()
chức năng thành công.
Tuy nhiên, không hàm nào thành công khi chúng ta sử dụng toán tử ký tự đại diện mảng để chọn tất cả các phần tử vô hướng từ mảng. Trong trường hợp này, JSON_EXTRACT()
đến để giải cứu:
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;
Kết quả:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Tuy nhiên, nếu các phần tử của mảng là mảng hoặc đối tượng thì JSON_QUERY()
trả lại chúng tốt:
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;
Kết quả:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+