Trong MariaDB, JSON_CONTAINS_PATH()
là một hàm tích hợp cho biết liệu một tài liệu JSON nhất định có chứa dữ liệu tại đường dẫn hoặc đường dẫn được chỉ định hay không.
Nó trả về 1
nếu tài liệu có chứa dữ liệu tại / s đường dẫn được chỉ định, 0
nếu không, và NULL
nếu bất kỳ đối số nào là NULL
.
Cú pháp
Cú pháp như sau:
JSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)
Ở đâu json_doc
là tài liệu JSON và path
chỉ định đường dẫn để tìm dữ liệu. Nhiều đường dẫn có thể được cung cấp.
return_arg
đối số xác định cách xử lý với nhiều đường dẫn. Nó có thể là one
hoặc all
.
-
one
- Hàm trả về1
nếu có ít nhất một đường dẫn trong tài liệu JSON. -
all
- Hàm trả về1
chỉ khi tất cả các đường dẫn tồn tại trong tài liệu JSON.
Ví dụ
Đây là một ví dụ để chứng minh.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.name');
Kết quả:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.name') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
Trong trường hợp này, đường dẫn tồn tại và kết quả là 1
.
Trong ví dụ tiếp theo, đường dẫn không tồn tại và kết quả là 0
:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.type');
Kết quả:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.type') | +-----------------------------------------------------+ | 0 | +-----------------------------------------------------+
Nhiều đường dẫn
Dưới đây là một số ví dụ tìm kiếm nhiều đường dẫn trong tài liệu:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.type',
'$.weight'
) AS Result;
Kết quả:
+--------+ | Result | +--------+ | 1 | +--------+
Trong ví dụ này, chúng tôi đã tìm kiếm hai con đường. Một con đường tồn tại và con đường kia thì không. Nhưng chúng tôi có 1
anyway (một kết quả tích cực). Điều này là do chúng tôi đã sử dụng one
như đối số thứ hai. one
chỉ định rằng chúng ta sẽ nhận được 1
nếu có bất kỳ đường dẫn nào tồn tại.
Đây là những gì sẽ xảy ra nếu chúng tôi sử dụng all
như đối số thứ hai:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.type',
'$.weight'
) AS Result;
Kết quả:
+--------+ | Result | +--------+ | 0 | +--------+
Lần này kết quả là 0
, bởi vì không phải tất cả các đường dẫn đều tồn tại trong tài liệu JSON.
Nếu chúng tôi thay đổi đường dẫn bị thiếu ($.type
) với một cái tồn tại, chúng tôi nhận được một kết quả khác:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.name',
'$.weight'
) AS Result;
Kết quả:
+--------+ | Result | +--------+ | 1 | +--------+
Mảng
Dưới đây là một ví dụ kiểm tra xem một chỉ mục nhất định có tồn tại trong một mảng hay không:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[2]'
) AS Result;
Kết quả:
+--------+ | Result | +--------+ | 1 | +--------+
Và đây là điều sẽ xảy ra nếu chúng tôi tăng chỉ mục lên chỉ mục không tồn tại:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[3]'
) AS Result;
Kết quả:
+--------+ | Result | +--------+ | 0 | +--------+
Cấu trúc lồng nhau
Dưới đây là một ví dụ tìm kiếm một đường dẫn trong một tài liệu lồng nhau:
SET @json_document = '
{
"name": "Wag",
"specs": {
"weight": 10,
"height": 30
}
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.specs.height'
) AS Result;
Kết quả:
+--------+ | Result | +--------+ | 1 | +--------+
Đối số rỗng
Nếu bất kỳ đối số nào là NULL
, kết quả là NULL
:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT
JSON_CONTAINS_PATH(null, 'one', '$.weight') AS a,
JSON_CONTAINS_PATH(@json_document, null, '$.weight') AS b,
JSON_CONTAINS_PATH(@json_document, 'one', null) AS c;
Kết quả:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Đếm tham số không chính xác
Không cung cấp đối số dẫn đến lỗi:
SELECT JSON_CONTAINS_PATH();
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'
Điều tương tự cũng xảy ra khi bạn không vượt qua đủ đối số:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document);
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'