SQLite поиск внутри столбца с JSON внутри - PullRequest
0 голосов
/ 01 марта 2019

У меня есть база данных SQLite, где столбец называется i18n и содержит дерево JSON, в котором содержатся некоторые локализованные строки.Например:

{"gr":{"name":"NAME_IN_GR"},"ru":{"name":"NAME_IN_RU"}}

Теперь я должен выполнить поиск частичной строки, набранной пользователем внутри узла name пройденной локализации.Моя первая попытка - использовать регулярное выражение, но я боюсь, что оно может быть немного медленнее (все должно происходить, пока пользователь печатает, даже если операция ограничена).Сейчас я рассматриваю два других способа:

  • создать виртуальную таблицу с помощью FTS?Как это работает?
  • изменить / сделать копию БД, где эти поля разбиты внутри своих собственных столбцов (т. Е. RU, GR, IT и т. Д.).

Какое у вас предложение и простая реализация?

1 Ответ

0 голосов
/ 02 марта 2019

Если ваш экземпляр sqlite был скомпилирован с включенным расширением JSON1 , это просто:

SELECT * FROM yourtable AS t
WHERE EXISTS (SELECT j.id FROM json_each(t.i18n) AS j
              WHERE json_extract(j.value, '$.name') LIKE 'NAME_IN%');

Однако, небольшое изменение вашей второй идеи, вытаскивая все эти подпрограммы JSON-объекты в строках таблицы (вместо одного столбца на язык, который быстро становится громоздким по мере роста количества языков), вероятно, лучший вариант:

CREATE TABLE translations(original TEXT, language TEXT, translated TEXT
                        , PRIMARY KEY(original, language)) WITHOUT ROWID;
INSERT INTO translations VALUES ('name', 'ru', 'название');
-- etc.

Масштабируемый, легче проверять и обновлятьданные, позволяющие получить только нужные биты, работать лучше и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...