Пример SQLite JSON1 для экстракта JSON\set

SQLite теперь имеет экспериментальное расширение JSON1 для работы с полями JSON. Функции на выбор выглядят многообещающе, но я не понимаю, как их использовать в контексте запроса.

Предположим, я создал следующую таблицу:

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

Документация показывает, как использовать json_each в запросе, но во всех других функциях отсутствует некоторая контекстная документация.

Может ли кто-то с опытом работы с SQLite привести несколько примеров использования:

  • json_extract
  • json_set

Ответ 1

Итак, вот первый пример использования json_extract. Во-первых, данные вставляются немного по-другому:

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

Теперь мы можем выбрать все номера телефонов пользователей, как в обычном sql:

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

Но что, если нас не волнуют наземные линии, и мы хотим только сотовые телефоны?
Введите json_extract:

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

И вот как использовать json_extract.

Использование json_set аналогично. Учитывая, что мы хотим обновить сотовый телефон:

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

Вы можете комбинировать эти вызовы функций в других SQL-запросах. Таким образом, вы можете используйте SQLite со структурированными данными и с неструктурированными данными в форме JSON.

Вот как обновить только мобильный телефон пользователя:

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"}