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

SQLite JSON_REPLACE ()

SQLite json_replace() hàm cho phép chúng tôi thay thế một giá trị hiện có trong tài liệu JSON bằng một giá trị khác.

Chúng tôi chuyển JSON ban đầu làm đối số đầu tiên khi chúng tôi gọi hàm, theo sau là đường dẫn của giá trị cần thay thế, tiếp theo là giá trị cần thay thế.

Chúng tôi cũng có thể thay thế nhiều cặp khóa / giá trị nếu được yêu cầu.

Cú pháp

Nó hoạt động như thế này:

json_replace(json, path1, value1, path2, value2...)

Ở đâu json đại diện cho JSON gốc và path1, value1, path2, value2... là các cặp đường dẫn / giá trị để thay thế.

Ví dụ

Dưới đây là một ví dụ cơ bản để chứng minh:

SELECT json_replace('{ "name" : "Fluffy" }', '$.name', "Baldy");

Kết quả:

{"name":"Baldy"}

Tại đây, tôi đã cập nhật giá trị của name khóa từ Fluffy thành Baldy .

Chúng tôi có thể cập nhật nhiều cặp khóa / giá trị như sau:

SELECT json_replace('{ 
    "name" : "Fluffy", 
    "age" : 10
    }', 
    '$.name', "Baldy", 
    '$.age', 11 
    );

Kết quả:

{"name":"Baldy","age":11}

Tôi chỉ cần thêm nhiều đối số khóa / giá trị hơn khi tôi gọi json_replace() .

Ở đây, tôi đã sử dụng ngắt dòng để làm cho mã dễ đọc hơn. Tất cả có thể nằm trên một dòng - kết quả sẽ giống nhau.

Điều gì sẽ xảy ra nếu Khóa không tồn tại?

Nếu khóa chưa tồn tại trong JSON, thì không có gì thay thế được:

SELECT json_replace('{ "name" : "Fluffy" }', '$.age', 11);

Kết quả:

{"name":"Fluffy"}

Đây là đặc điểm chính phân biệt json_replace() từ json_set()json_insert() chức năng. Các hàm đó sẽ chèn giá trị nếu khóa chưa tồn tại.

Tuy nhiên, có thể chèn các khóa mới một cách hiệu quả với json_replace() bằng cách thay thế toàn bộ đối tượng / tài liệu JSON. Ví dụ bên dưới.

Thay thế Toàn bộ Tài liệu JSON

Chúng ta có thể sử dụng json_replace() để thay thế toàn bộ tài liệu JSON bằng một tài liệu khác:

SELECT json_replace('{ "name" : "Fluffy" }', '$', json('{ "name" : "Baldy" }') );

Kết quả:

{"name":"Baldy"}

Vì vậy, điều này cho phép chúng tôi chèn các khóa mới vào tài liệu một cách hiệu quả:

SELECT json_replace('{ 
    "name" : "Fluffy" 
    }', 
    '$', 
    json('{ 
        "name" : "Baldy" ,
        "age" : 11
        }'
    ) 
);

Kết quả:

{"name":"Baldy","age":11}

Nói một cách chính xác, chúng tôi không chèn bất kỳ khóa mới nào. Chúng tôi chỉ đơn giản là thay thế toàn bộ tài liệu. Nhưng kết quả là một tài liệu JSON chứa các khóa mà tài liệu gốc không chứa.

Thay thế một đối tượng được nhúng

Chúng tôi cũng có thể thay thế các đối tượng nhúng:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    json('{ "c" : 2 }') 
    );

Kết quả:

{"a":1,"b":{"c":2}}

Khi thực hiện việc này, tôi đã sử dụng json() hàm trả về đối số của tôi dưới dạng chuỗi JSON. Đây là những gì sẽ xảy ra khi tôi không làm điều đó:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    '{ "c" : 2 }' 
    );

Kết quả:

{"a":1,"b":"{ \"c\" : 2 }"}

Tài liệu JSON được chèn dưới dạng giá trị văn bản thay vì đối tượng JSON và do đó dấu ngoặc kép của nó được thoát bằng dấu gạch chéo ngược.

Tuy nhiên, chúng tôi không thể chỉ xóa các dấu ngoặc kép vì điều này dẫn đến lỗi:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    { "c" : 2 }
    );

Kết quả:

Parse error: unrecognized token: "{"
        "b" : { "c" : 1 }      }',      '$.b',      { "c" : 2 }     );
                                      error here ---^

Không có dấu ngoặc kép hoặc json() , chúng ta gặp lỗi ngay khi nó gặp phải dấu ngoặc nhọn bên trái. Do đó, chúng tôi cần sử dụng dấu ngoặc kép hoặc json() , tùy thuộc vào việc chúng ta đang chèn một đối tượng JSON hay một chuỗi / giá trị văn bản SQL.

Một cách khác để chèn một đối tượng JSON là sử dụng json_object() thay vì json() chức năng:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    json_object('c', 2) 
    );

Kết quả:

{"a":1,"b":{"c":2}}

Thay thế một mảng

Khái niệm tương tự cũng áp dụng với mảng:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json('[ 5, 6, 7 ]'));

Kết quả:

{"a":[5,6,7]}

Nếu chúng ta xóa json() , chúng tôi nhận được cái này:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', '[ 5, 6, 7 ]');

Kết quả:

{"a":"[ 5, 6, 7 ]"}

Và nếu chúng tôi xóa các dấu ngoặc kép, chúng tôi sẽ gặp lỗi:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);

Kết quả:

Parse error: no such column:  5, 6, 7  (17)
  LECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);
                                      error here ---^

Ngoài ra, chúng ta có thể sử dụng json_array() hàm thay vì json() . Hàm đó cho phép bạn tạo một mảng dựa trên các đối số của nó:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json_array(5, 6, 7));

Kết quả:

{"a":[5,6,7]}

Nối Giá trị vào cuối Mảng

Để nối các giá trị vào cuối một mảng, chúng ta có thể sử dụng json_insert() hoặc json_set() chức năng.

Tuy nhiên, nếu chúng ta phải sử dụng json_replace() , chúng ta có thể thay thế toàn bộ mảng bằng một mảng khác có giá trị phụ / s được thêm vào cuối mảng:

SELECT json_replace('[ 1, 2, 3 ]', '$', json('[ 1, 2, 3, 4 ]') );

Kết quả:

[1,2,3,4]

Nhưng như đã đề cập, json_insert()json_set() cho phép bạn thực sự nối các giá trị vào mảng mà không cần thay thế toàn bộ mảng.

Thay thế các phần tử mảng

Đây là một ví dụ về việc sử dụng json_replace() để thay thế một phần tử trong một mảng:

SELECT json_replace('[ 1, 2, 3 ]', '$[1]', 4 );

Kết quả:

[1,4,3]

Mảng dựa trên 0 và vì vậy [1] cho biết mục mảng thứ hai.

json_set() chức năng cũng có thể được sử dụng để thay thế các phần tử hiện có. Tuy nhiên, json_insert() chức năng không cho phép chúng tôi thay thế các phần tử hiện có.

Đường dẫn không hợp lệ

Chúng tôi sẽ gặp lỗi nếu đường dẫn của chúng tôi không đúng:

SELECT json_replace('{ "a" : 1 }', 'a', 2);

Kết quả:

Runtime error: JSON path error near 'a'

Trong trường hợp này, tôi đã quên bao gồm $. ở phía trước của con đường.

Tài liệu JSON không hợp lệ

Chúng tôi cũng sẽ gặp lỗi do JSON không được định dạng tốt:

SELECT json_replace('{ "a" : 1', '$.a', 2);

Kết quả:

Runtime error: malformed JSON

Lần này, lỗi cho chúng tôi biết rằng JSON của chúng tôi không đúng định dạng.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CHẾ ĐỘ XEM DROP của SQLite

  2. Cách chính xác để xử lý Bi hướng 1:m trong Green-DAO

  3. Thêm ngày vào một ngày trong SQLite

  4. SQLite JSON_EACH ()

  5. Những phương pháp nào có thể được sử dụng để quản lý các phiên bản khác nhau của cơ sở dữ liệu đã có từ trước?