SQLite
 sql >> Baza danych >  >> RDS >> SQLite

JSON_INSERT() vs JSON_SET() vs JSON_REPLACE() w SQLite

SQLite udostępnia kilka funkcji do wstawiania, ustawiania i zastępowania wartości w dokumencie JSON. W szczególności zapewnia json_insert() , json_set() i json_replace() .

Te funkcje wykonują podobne zadania i czasami można ich używać zamiennie do pewnego momentu.

Ale zdecydowanie istnieje wyraźna różnica między każdą funkcją.

Różnica

Poniższa tabela przedstawia różnice między tymi funkcjami:

Funkcja Zastąpić, jeśli już istnieje? Utworzyć, jeśli nie istnieje?
json_insert() Nie Tak
json_replace() Tak Nie
json_set() Tak Tak

Tak więc różnica między tymi funkcjami polega na tym, jak radzą sobie z istniejącymi i nieistniejącymi kluczami/wartościami.

Przykłady

Oto kilka prostych przykładów pokazujących, jak każda funkcja radzi sobie z istniejącymi i nieistniejącymi kluczami/wartościami.

Kiedy klucz już istnieje

Oto jak każda funkcja radzi sobie z aktualizacją klucza, który już istnieje:

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;

Wynik:

+-------------+--------------+----------+
| json_insert | json_replace | json_set |
+-------------+--------------+----------+
| {"a":1}     | {"a":2}      | {"a":2}  |
+-------------+--------------+----------+

Widzimy, że json_insert() niczego nie aktualizował, ale pozostałe dwie funkcje tak.

Podobnie jest z tablicami:

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;

Wynik:

+-------------+--------------+----------+
| json_insert | json_replace | json_set |
+-------------+--------------+----------+
| [1,2,3]     | [1,4,3]      | [1,4,3]  |
+-------------+--------------+----------+

Kiedy klucz nie istnieje

Oto, co się dzieje, gdy klucz nie istnieje:

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;

Wynik:

+---------------+--------------+---------------+
|  json_insert  | json_replace |   json_set    |
+---------------+--------------+---------------+
| {"a":1,"b":2} | {"a":1}      | {"a":1,"b":2} |
+---------------+--------------+---------------+

Widzimy, że json_replace() nie wstawił nowej pary klucz/wartość, ale pozostałe dwie funkcje tak.

To samo dotyczy tablic:

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;

Wynik:

+-------------+--------------+-----------+
| json_insert | json_replace | json_set  |
+-------------+--------------+-----------+
| [1,2,3,4]   | [1,2,3]      | [1,2,3,4] |
+-------------+--------------+-----------+

Można to również zrobić za pomocą [#] ścieżka:

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;

Wynik:

+-------------+--------------+-----------+
| json_insert | json_replace | json_set  |
+-------------+--------------+-----------+
| [1,2,3,4]   | [1,2,3]      | [1,2,3,4] |
+-------------+--------------+-----------+

Jedna korzyść z używania [#] jest to, że nie musisz wiedzieć, ile elementów jest już w tablicy.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Android :Błąd kopiowania bazy danych (Sqliite) z folderu zasobów

  2. Ograniczenie tabeli SQLite unikalne i użycie ON CONFLICT REPLACE

  3. Suma nad wartościami według miesiąca w milisekundach

  4. Robolectric uzyskujący dostęp do bazy danych zgłasza błąd

  5. Problem z pamięcią SQLite przy podejściu singleton