SQLite предоставя няколко функции за вмъкване, настройка и замяна на стойности в JSON документ. По-конкретно, той предоставя json_insert() , json_set() и json_replace() .
Тези функции изпълняват подобни задачи и понякога можете да ги използвате взаимозаменяемо до определен момент.
Но определено има ясна разлика между всяка функция.
Разликата
Следната таблица очертава разликата между тези функции:
| Функция | Да се презапише, ако вече съществува? | Създаване, ако не съществува? |
|---|---|---|
json_insert() | Не | Да |
json_replace() | Да | Не |
json_set() | Да | Да |
Така че разликата между тези функции е в начина, по който се справят със съществуващи и несъществуващи ключове/стойности.
Примери
Ето няколко прости примера, които демонстрират как всяка функция се справя със съществуващи и несъществуващи ключове/стойности.
Когато ключът вече съществува
Ето как всяка функция се справя с актуализирането на ключ, който вече съществува:
SELECT
json_insert('{ "a" : 1 }', '$.a', 2) AS json_insert,
json_replace('{ "a" : 1 }', '$.a', 2) AS json_replace,
json_set('{ "a" : 1 }', '$.a', 2) AS json_set; Резултат:
+------------+--------------+----------+| json_insert | json_replace | json_set |+------------+--------------+----------+| {"a":1} | {"a":2} | {"a":2} |+------------+--------------+---------+предварително>
Можем да видим, че json_insert() не актуализира нищо, но другите две функции го направиха.
Подобно е нещо с масивите:
SELECT
json_insert('[ 1, 2, 3 ]', '$[1]', 4) AS json_insert,
json_replace('[ 1, 2, 3 ]', '$[1]', 4) AS json_replace,
json_set('[ 1, 2, 3 ]', '$[1]', 4) AS json_set;
Резултат:
+------------+--------------+----------+| json_insert | json_replace | json_set |+------------+--------------+----------+| [1,2,3] | [1,4,3] | [1,4,3] |+------------+--------------+---------+предварително> Когато ключът не съществува
Ето какво се случва, когато ключът не съществува:
SELECT
json_insert('{ "a" : 1 }', '$.b', 2) AS json_insert,
json_replace('{ "a" : 1 }', '$.b', 2) AS json_replace,
json_set('{ "a" : 1 }', '$.b', 2) AS json_set;
Резултат:
+--------------+--------------+-------------- +| json_insert | json_replace | json_set |+---------------+--------------+--------------+ | {"a":1,"b":2} | {"a":1} | {"a":1,"b":2} |+--------------+--------------+---- -----------+
Можем да видим, че json_replace() не вмъкна новата двойка ключ/стойност, но другите две функции го направиха.
Същата работа с масивите:
SELECT
json_insert('[ 1, 2, 3 ]', '$[3]', 4) AS json_insert,
json_replace('[ 1, 2, 3 ]', '$[3]', 4) AS json_replace,
json_set('[ 1, 2, 3 ]', '$[3]', 4) AS json_set;
Резултат:
+------------+--------------+-----------+| json_insert | json_replace | json_set |+------------+--------------+-----------+| [1,2,3,4] | [1,2,3] | [1,2,3,4] |+------------+--------------+---------- -+
Това може да стане и с помощта на [#] път:
SELECT
json_insert('[ 1, 2, 3 ]', '$[#]', 4) AS json_insert,
json_replace('[ 1, 2, 3 ]', '$[#]', 4) AS json_replace,
json_set('[ 1, 2, 3 ]', '$[#]', 4) AS json_set;
Резултат:
+------------+--------------+-----------+| json_insert | json_replace | json_set |+------------+--------------+-----------+| [1,2,3,4] | [1,2,3] | [1,2,3,4] |+------------+--------------+--------- -+
Едно предимство от използването на [#] е, че не е нужно да знаете колко елемента вече има в масива.