MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

MariaDB JSON_REMOVE () Giải thích

Trong MariaDB, JSON_REMOVE() là một hàm tích hợp để xóa dữ liệu khỏi tài liệu JSON và trả về kết quả.

Cú pháp

Cú pháp như sau:

JSON_REMOVE(json_doc, path[, path] ...)

Ví dụ

Đây là một ví dụ để chứng minh.

SET @json = '{ "name" : "Wag", "type" : "Dog" }';

SELECT JSON_REMOVE(@json, '$.type');

Kết quả:

+------------------------------+
| JSON_REMOVE(@json, '$.type') |
+------------------------------+
| {"name": "Wag"}              |
+------------------------------+

Trong trường hợp này, chúng tôi đã xóa thành viên dữ liệu type từ tài liệu. Nói cách khác, type khóa và giá trị liên quan của nó đã bị xóa.

Mảng

JSON_REMOVE() có thể được sử dụng để xóa toàn bộ mảng hoặc các phần tử cụ thể trong mảng.

Để xóa toàn bộ mảng, chỉ cần sử dụng tên khóa:

SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';

SELECT JSON_REMOVE(@json, '$.scores');

Kết quả:

+--------------------------------+
| JSON_REMOVE(@json, '$.scores') |
+--------------------------------+
| {"name": "Wag"}                |
+--------------------------------+

Điều đó đã xóa toàn bộ mảng khỏi tài liệu.

Để xóa một phần tử mảng, hãy chỉ định chỉ số của phần tử. Dưới đây là một ví dụ về việc xóa một phần tử mảng khỏi một mảng:

SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';

SELECT JSON_REMOVE(@json, '$.scores[1]');

Kết quả:

+-----------------------------------+
| JSON_REMOVE(@json, '$.scores[1]') |
+-----------------------------------+
| {"name": "Wag", "scores": [8, 9]} |
+-----------------------------------+

Trong trường hợp này, phần tử mảng thứ hai đã bị xóa. Mảng dựa trên 0 và vì vậy $.scores[1] tham chiếu đến phần tử thứ hai trong mảng.

Xem bên dưới để biết cách thực hiện JSON_REMOVE() giải quyết việc xóa nhiều đường dẫn trong mảng.

Nhiều đường dẫn

Khi cung cấp nhiều đường dẫn, chúng được đánh giá từ trái sang phải. Điều này có nghĩa là kết quả từ lần đánh giá trước đó được sử dụng làm giá trị cho lần tiếp theo.

Cần đặc biệt lưu ý đến điều này khi xóa các phần tử khỏi một mảng dựa trên chỉ mục của chúng.

Đầu tiên, đây là một ví dụ xóa nhiều đường dẫn khỏi tài liệu, dựa trên khóa của chúng:

SET @json = '
    { 
        "name" : "Wag", 
        "type" : "Dog",
        "weight" : 10
    }
';

SELECT JSON_REMOVE(@json, '$.type', '$.weight');

Kết quả:

+------------------------------------------+
| JSON_REMOVE(@json, '$.type', '$.weight') |
+------------------------------------------+
| {"name": "Wag"}                          |
+------------------------------------------+

Mỗi cặp khóa / giá trị đã bị xóa như mong đợi.

Trong ví dụ tiếp theo, chúng tôi không xóa cặp khóa / giá trị. Thay vào đó, chúng tôi xóa nhiều phần tử khỏi một mảng:

SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';

SELECT 
    JSON_REMOVE(@json, '$.scores[2]', '$.scores[4]') AS a,
    JSON_REMOVE(@json, '$.scores[4]', '$.scores[2]') AS b;

Kết quả:

+--------------------------+--------------------------+
| a                        | b                        |
+--------------------------+--------------------------+
| {"scores": [0, 1, 3, 4]} | {"scores": [0, 1, 3, 5]} |
+--------------------------+--------------------------+

Trong trường hợp này, chúng tôi gọi là JSON_REMOVE() hai lần. Cả hai đều chỉ định cùng một chỉ mục mảng để loại bỏ (24 ), nhưng chúng tôi hoán đổi các đối số trong lần gọi thứ hai. Trong ví dụ đầu tiên, nó đi theo 2 rồi đến 4 (theo thứ tự đó). Trong ví dụ thứ hai, đó là 4 rồi đến 2 .

Điều này tạo ra một kết quả khác nhau cho mỗi cuộc gọi. Như đã đề cập, nhiều đường dẫn được đánh giá từ trái sang phải và do đó, thứ tự có thể ảnh hưởng đến kết quả.

Dưới đây là một ví dụ khác minh họa cách kết quả có thể khá khác nhau, tùy thuộc vào số lượng đường dẫn được chỉ định, đường dẫn nào và theo thứ tự nào:

SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';

SELECT 
    JSON_REMOVE(@json, '$.scores[0]', '$.scores[1]', '$.scores[5]') AS a,
    JSON_REMOVE(@json, '$.scores[1]', '$.scores[5]', '$.scores[0]') AS b,
    JSON_REMOVE(@json, '$.scores[5]', '$.scores[0]', '$.scores[1]') AS c,
    JSON_REMOVE(@json, '$.scores[5]', '$.scores[1]', '$.scores[0]') AS d,
    JSON_REMOVE(@json, '$.scores[1]', '$.scores[0]', '$.scores[5]') AS e,
    JSON_REMOVE(@json, '$.scores[0]', '$.scores[5]', '$.scores[1]') AS f;

Kết quả (sử dụng đầu ra dọc):

a: {"scores": [1, 3, 4, 5]}
b: {"scores": [2, 3, 4, 5]}
c: {"scores": [1, 3, 4]}
d: {"scores": [2, 3, 4]}
e: {"scores": [2, 3, 4, 5]}
f: {"scores": [1, 3, 4, 5]}

Đối số rỗng

Nếu bất kỳ đối số nào là NULL , kết quả là NULL :

SELECT 
    JSON_REMOVE(null, '$.a') AS a,
    JSON_REMOVE('{"a":1}', null) AS b,
    JSON_REMOVE(null, null) AS c;

Kết quả:

+------+------+------+
| a    | b    | c    |
+------+------+------+
| NULL | NULL | NULL |
+------+------+------+

Đếm tham số không chính xác

Đang gọi JSON_REMOVE() không có đối số dẫn đến lỗi:

SELECT JSON_REMOVE();

Kết quả:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'

Điều này cũng tương tự khi không truyền đủ đối số:

SELECT JSON_REMOVE('{"a":1}');

Kết quả:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mẹo lưu trữ bản sao lưu MariaDB của bạn trên đám mây

  2. 6 cách để thêm một năm vào một ngày trong MariaDB

  3. Hướng dẫn sao chép luồng trực tuyến cụm MySQL Galera:Phần thứ hai

  4. Giới thiệu Giám sát cơ sở dữ liệu dựa trên tác nhân với ClusterControl 1.7

  5. Cách STRCMP () hoạt động trong MariaDB