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

SQLite JSON_SET () 

SQLite json_set() cho phép chúng tôi chèn vào hoặc thay thế một giá trị trong tài liệu JSON.

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à một đường dẫn chỉ định vị trí để chèn / thay thế giá trị mới, tiếp theo là giá trị để chèn / thay thế.

Chúng tôi cũng có thể chèn / 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_set(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ị mà chúng tôi có thể sử dụng để chèn các giá trị mới vào tài liệu JSON (hoặc thay thế, tùy từng trường hợp).

Ví dụ

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

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

Kết quả:

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

Tại đây, tôi đã chèn một cặp khóa / giá trị mới ("b":2 ) vào tài liệu JSON.

Chúng tôi có thể chèn nhiều cặp khóa / giá trị như thế này:

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

Kết quả:

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

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

Thay thế giá trị

Nếu khóa đã tồn tại, giá trị của nó sẽ được thay thế bằng giá trị mới:

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

Kết quả:

{"a":1,"b":3}

Đây là sự khác biệt chính giữa json_set()json_insert() . json_insert() hàm sẽ không chèn giá trị nếu khóa đã tồn tại.

Một cách khác để thay thế các giá trị là sử dụng json_replace() .

Chèn một đối tượng

Dưới đây là một ví dụ về cách chèn một đối tượng JSON:

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

Kết quả:

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

Trong trường hợp 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_set('{ "a" : 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ỉ cần loại bỏ các dấu ngoặc kép đơn lẻ sẽ dẫn đến lỗi:

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

Kết quả:

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

Không có dấu ngoặc kép hoặc json() , chúng tôi gặp lỗi ngay khi nó gặp phải dấu ngoặc nhọn bên trái.

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_set('{ "a" : 1 }', '$.b', json_object('c', 2) );

Kết quả:

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

Chèn một mảng

Điều tương tự khi chèn mảng:

SELECT json_set('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));

Kết quả:

{"a":1,"b":[2,3,4]}

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

SELECT json_set('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');

Kết quả:

{"a":1,"b":"[ 2, 3, 4 ]"}

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_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);

Kết quả:

Parse error: no such column:  2, 3, 4 
  SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
                          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_set('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );

Kết quả:

{"a":1,"b":[2,3,4]}

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

Chúng ta có thể sử dụng json_set() để nối các giá trị vào cuối một mảng.

Để thực hiện việc này, hãy sử dụng chỉ mục mảng của [#] :

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

Kết quả:

[1,2,3,4]

Nguyên tắc tương tự cũng áp dụng cho các mảng lồng nhau:

SELECT json_set('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );

Kết quả:

[1,["a","b","c"],3]

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

Chúng ta có thể sử dụng json_set() để thay thế các phần tử trong mảng:

SELECT json_set('[ 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_replace() chức năng cũng có thể được sử dụng để thay thế các phần tử hiện có. Một lần nữa, điều này khác với json_insert() , không 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_set('{ "a" : 1 }', 'b', 2);

Kết quả:

Runtime error: JSON path error near 'b'

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_set('{ "a" : 1', '$.b', 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. Cách liệt kê tên bảng từ DB sqlite - Android

  2. Trình kích hoạt SQLite

  3. Làm thế nào để cung cấp cho vị trí 0 của spinner một giá trị nhắc nhở?

  4. Cách sử dụng ROW_NUMBER trong sqlite

  5. Làm cách nào để điền ListView với db vào thư mục nội dung?