web-dev-qa-db-fra.com

Exemple SQLite JSON1 pour l'extrait JSON \ set

SQLite a maintenant une extension JSON1 expérimentale pour travailler avec les champs JSON. Les fonctions à choisir semblent prometteuses, mais je ne sais pas comment les utiliser dans le contexte d'une requête.

Supposons que j'ai créé le tableau suivant:

sqlite> create table user(name,phone);
sqlite> insert into user values('oz', json_array(['+491765','+498973']));

documentation montre comment utiliser json_each dans une requête, mais toutes les autres fonctions manquent dans la documentation contextuelle.

Une personne ayant une expérience SQLite peut-elle fournir quelques exemples d'utilisation:

  • json_extract
  • json_set
19
Oz123

Voici donc un premier exemple d'utilisation de json_extract. Tout d'abord, les données sont insérées de manière un peu différente:

insert into user (name, phone) values("oz", json('{"cell":"+491765", "home":"+498973"}'));

Maintenant, nous pouvons sélectionner tous les numéros de téléphone des utilisateurs comme dans sql normal:

sqlite> select user.phone from user where user.name=='oz';
{"cell":"+491765","home":"+498973"}
sqlite> 

Mais que se passe-t-il si nous ne nous soucions pas des lignes terrestres et que nous voulons uniquement des téléphones portables?
Entrer json_extract:

sqlite> select json_extract(user.phone, '$.cell') from user;
+491765

Et voici comment utiliser json_extract.

En utilisant json_set est similaire. Étant donné que nous voulons mettre à jour le téléphone portable:

sqlite> select json_set(json(user.phone), '$.cell', 123) from \
        user;
{"cell":123,"home":"+498973"}

Vous pouvez combiner ces appels de fonction dans d'autres requêtes SQL. Ainsi, vous pouvez utiliser SQLite avec des données structurées et avec des données non structurées sous forme de JSON.

Voici comment mettre à jour le téléphone portable de l'utilisateur uniquement:

sqlite> update user 
   ...> set phone =(select json_set(json(user.phone), '$.cell', 721) from user)
   ...> where name == 'oz';
sqlite> select * from user;
oz|{"cell":721,"home":"+498973"}
32
Oz123