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

SQLite JSON_REPLACE()

SQLite json_replace() funkcja pozwala nam zastąpić istniejącą wartość w dokumencie JSON inną wartością.

Gdy wywołujemy funkcję, jako pierwszy argument przekazujemy oryginalny JSON, po którym następuje ścieżka wartości do zastąpienia, po której następuje wartość do zastąpienia.

W razie potrzeby możemy również zastąpić wiele par klucz/wartość.

Składnia

Działa to tak:

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

Gdzie json reprezentuje oryginalny JSON, a path1, value1, path2, value2... są parami ścieżka/wartość do zastąpienia.

Przykład

Oto podstawowy przykład do zademonstrowania:

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

Wynik:

{"name":"Baldy"}

Tutaj zaktualizowałem wartość name klucz od Fluffy do Baldy .

Możemy zaktualizować wiele par klucz/wartość w ten sposób:

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

Wynik:

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

Po prostu dodałem więcej argumentów klucz/wartość, gdy wywołałem json_replace() .

Tutaj użyłem łamania linii, aby kod był łatwiejszy do odczytania. Wszystko mogło być na jednej linii – wynik byłby taki sam.

Co jeśli klucz nie istnieje?

Jeśli klucz nie istnieje jeszcze w JSON, nic nie jest zastępowane:

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

Wynik:

{"name":"Fluffy"}

Jest to główna cecha wyróżniająca json_replace() funkcja z json_set() i json_insert() Funkcje. Te funkcje wstawią wartość, jeśli klucz jeszcze nie istnieje.

Jednak możliwe jest efektywne wstawianie nowych kluczy za pomocą json_replace() poprzez zastąpienie całego obiektu/dokumentu JSON. Przykład poniżej.

Zastąp cały dokument JSON

Możemy użyć json_replace() zastąpić cały dokument JSON innym:

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

Wynik:

{"name":"Baldy"}

Dzięki temu możemy skutecznie wstawiać nowe klucze do dokumentu:

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

Wynik:

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

Ściśle mówiąc, nie włożyliśmy żadnych nowych kluczy. Po prostu wymieniliśmy cały dokument. Ale w rezultacie powstał dokument JSON zawierający klucze, których oryginalny nie zawierał.

Zamień osadzony obiekt

Możemy również zastąpić osadzone obiekty:

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

Wynik:

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

Kiedy to zrobiłem, użyłem json() funkcja, aby zwrócić mój argument jako ciąg JSON. Oto, co się dzieje, gdy tego nie robię:

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

Wynik:

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

Dokument JSON jest wstawiany jako wartość tekstowa zamiast obiektu JSON, dlatego jego podwójne cudzysłowy są poprzedzone ukośnikami odwrotnymi.

Nie możemy jednak po prostu usunąć pojedynczych cudzysłowów, ponieważ powoduje to błąd:

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

Wynik:

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

Bez pojedynczych cudzysłowów lub json() funkcji, otrzymujemy błąd, gdy tylko napotka lewy nawias klamrowy. Dlatego musimy użyć pojedynczych cudzysłowów lub json() funkcji, w zależności od tego, czy wstawiamy obiekt JSON, czy ciąg/wartość tekstową SQL.

Innym sposobem wstawienia obiektu JSON jest użycie json_object() funkcja zamiast json() funkcja:

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

Wynik:

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

Zamień tablicę

Ta sama koncepcja dotyczy tablic:

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

Wynik:

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

Jeśli usuniemy json() funkcja, otrzymujemy to:

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

Wynik:

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

A jeśli usuniemy pojedyncze cudzysłowy, otrzymamy błąd:

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

Wynik:

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

Możemy alternatywnie użyć json_array() funkcja zamiast json() . Ta funkcja umożliwia utworzenie tablicy na podstawie jej argumentów:

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

Wynik:

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

Dołącz wartości na końcu tablicy

Aby dołączyć wartości na końcu tablicy, możemy użyć funkcji json_insert() lub json_set() Funkcje.

Jeśli jednak musimy użyć json_replace() , możemy zastąpić całą tablicę inną, która ma dodatkowe wartości dodane na końcu tablicy:

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

Wynik:

[1,2,3,4]

Ale jak wspomniano, json_insert() i json_set() pozwalają na faktyczne dołączanie wartości do tablicy bez zastępowania całej tablicy.

Zamień elementy tablicy

Oto przykład użycia json_replace() aby zastąpić element w tablicy:

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

Wynik:

[1,4,3]

Tablice są oparte na zerach, więc [1] wskazuje drugi element tablicy.

json_set() funkcja może być również wykorzystana do zastąpienia istniejących elementów. Jednak json_insert() funkcja nie pozwala nam na podmianę istniejących elementów.

Nieprawidłowe ścieżki

Otrzymamy błąd, jeśli nasza ścieżka nie jest dobrze uformowana:

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

Wynik:

Runtime error: JSON path error near 'a'

W tym przypadku zapomniałem dołączyć $. z przodu ścieżki.

Nieprawidłowe dokumenty JSON

Otrzymamy również błąd, że JSON nie jest poprawnie sformułowany:

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

Wynik:

Runtime error: malformed JSON

Tym razem błąd mówi nam, że nasz JSON jest zniekształcony.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę podzielić długi, pojedynczy SQLiteOpenHelper na kilka klas, po jednej dla każdej tabeli?

  2. Jak działa SQLite Min()

  3. Wyjątek wskaźnika zerowego podczas wywoływania metody getReadableDatabase()

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

  5. Brak takiego wyjątku w kolumnie sqlite