SQLite
 sql >> база данни >  >> RDS >> SQLite

SQLite JSON_INSERT()

SQLite json_insert() функцията ни позволява да вмъкнем нова стойност в JSON документ.

Предаваме оригиналния JSON като първи аргумент, когато извикаме функцията, последван от път, който указва къде да се вмъкне новата стойност, последван от стойността за вмъкване.

Можем също да вмъкнем няколко двойки ключ/стойност, ако е необходимо.

Синтаксис

Функцията се извиква така:

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

Където json представлява оригиналния JSON и path1, value1, path2, value2... са двойки път/стойност, които можем да използваме, за да вмъкнем нови стойности в JSON документа.

Пример

Ето основен пример за демонстрация:

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

Резултат:

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

Тук вмъкнах нова двойка ключ/стойност ("b":2 ) в документа JSON.

Можем да вмъкнем няколко двойки ключ/стойност, както следва:

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

Резултат:

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

Просто добавих още аргументи ключ/стойност, когато извиках json_insert() .

Ключ/стойност вече съществува?

json_insert() функцията няма да вмъкне стойността, ако ключът вече съществува:

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

Резултат:

{"a":1}

В този случай ключът a вече съществува в JSON и затова опитът за вмъкване на нова стойност за този ключ не работи.

За да замените стойност, използвайте или json_replace() или json_set() .

Вмъкване на обект

Ето пример за вмъкване на друг JSON документ:

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

Резултат:

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

В този случай използвах json() функция, за да върне аргумента ми като JSON низ. Ето какво се случва, когато не го направя:

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

Резултат:

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

JSON документът се вмъква като текстова стойност вместо JSON обект и следователно неговите двойни кавички се екранират с обратна наклонена черта.

Това обаче е достатъчно справедливо. В крайна сметка заложихме новата стойност в единични кавички. Как беше SQLite да разбере дали искаме да вмъкнем низ или JSON обект?

И не е сякаш можем просто да премахнем тези единични кавички:

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

Резултат:

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

Без единични кавички или json() функция, получаваме грешка веднага щом срещне лявата фигурна скоба.

Друг начин да вмъкнете JSON обект е да използвате json_object() функция вместо json() функция:

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

Резултат:

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

Вмъкване на масив

Подобно нещо е и при вмъкване на масиви:

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

Резултат:

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

Ако премахнем json() функция, получаваме това:

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

Резултат:

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

И ако премахнем единичните кавички, получаваме грешка:

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

Резултат:

Parse error: no such column:  2, 3, 4 
  SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
                             error here ---^

Като алтернатива можем да използваме json_array() функция вместо json() . Тази функция ви позволява да създадете масив въз основа на неговите аргументи:

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

Резултат:

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

Добавяне на стойности в края на масив

Можем да използваме json_insert() за добавяне на стойности в края на масив.

За да направите това, използвайте индекс на масив от [#] :

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

Резултат:

[1,2,3,4]

Същият принцип важи и за вложените масиви:

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

Резултат:

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

Невалидни пътища

Ще получим грешка, ако пътят ни не е добре оформен:

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

Резултат:

Runtime error: JSON path error near 'b'

В този случай забравих да включа $. в предната част на пътеката.

Невалидни JSON документи

Ще получим и грешка, че JSON не е добре оформен:

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

Резултат:

Runtime error: malformed JSON

Този път грешката ни казва, че нашият JSON е неправилно оформен.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как Replace() работи в SQLite

  2. SQLite данни към RecyclerView

  3. Приложението спря да работи поради база данни

  4. Добавете данни към базата данни sqlite само веднъж и прочетете няколко пъти

  5. Връщане на редове, които съдържат буквено-цифрови знаци в SQLite