SQLite搜索内部带有JSON的列

时间:2019-03-01 17:06:47

标签: sqlite

我有一个SQLite数据库,其中一列称为i18n,并包含一个JSON树,其中包含一些本地化的字符串。 例如:

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

现在,我应该在传递的本地化的name节点内搜索由用户键入的部分字符串。 我最初的尝试是使用正则表达式,但恐怕它可能会慢一些(即使在用户操作受限制的情况下,用户键入时也会发生所有事情)。 现在,我正在考虑另外两种方式:

  • 使用FTS创建虚拟表?如何运作?
  • 更改/复制数据库的副本,其中这些字段在其自己的列(例如RUGRIT等中拆分)。

您有什么建议和简单的实现方式?

1 个答案:

答案 0 :(得分:1)

如果您的sqlite实例是在启用了JSON1 extension的情况下编译的,那么这很容易:

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.

可扩展,更易于检查和更新数据,让您仅检索相关位,性能更好等。