SQLite 在 JSON 列内搜索
SQLite search inside a column with JSON inside
我有一个 SQLite 数据库,其中一个名为 i18n
的列包含一个 JSON 树,其中包含一些本地化字符串。
例如:
{"gr":{"name":"NAME_IN_GR"},"ru":{"name":"NAME_IN_RU"}}
现在我应该在已通过本地化的 name
节点内搜索用户键入的部分字符串。
我最初的尝试是使用正则表达式,但我担心它可能会慢一点(即使操作受到限制,一切都应该在用户键入时发生)。
现在我在考虑另外两种方式:
- 使用 FTS 创建虚拟 table?它是如何工作的?
- alter/make 数据库副本,其中这些字段在各自的列中拆分(即
RU
、GR
、IT
等)。
你有什么建议和简单的实现方式?
如果您的 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 子对象拉出到 table 的行中(而不是每种语言一列,这很快就会变得笨拙,因为语言数量增加),可能是更好的选择:
CREATE TABLE translations(original TEXT, language TEXT, translated TEXT
, PRIMARY KEY(original, language)) WITHOUT ROWID;
INSERT INTO translations VALUES ('name', 'ru', 'название');
-- etc.
可扩展、更容易检查和更新数据、让您只检索相关位、性能更好等。
我有一个 SQLite 数据库,其中一个名为 i18n
的列包含一个 JSON 树,其中包含一些本地化字符串。
例如:
{"gr":{"name":"NAME_IN_GR"},"ru":{"name":"NAME_IN_RU"}}
现在我应该在已通过本地化的 name
节点内搜索用户键入的部分字符串。
我最初的尝试是使用正则表达式,但我担心它可能会慢一点(即使操作受到限制,一切都应该在用户键入时发生)。
现在我在考虑另外两种方式:
- 使用 FTS 创建虚拟 table?它是如何工作的?
- alter/make 数据库副本,其中这些字段在各自的列中拆分(即
RU
、GR
、IT
等)。
你有什么建议和简单的实现方式?
如果您的 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 子对象拉出到 table 的行中(而不是每种语言一列,这很快就会变得笨拙,因为语言数量增加),可能是更好的选择:
CREATE TABLE translations(original TEXT, language TEXT, translated TEXT
, PRIMARY KEY(original, language)) WITHOUT ROWID;
INSERT INTO translations VALUES ('name', 'ru', 'название');
-- etc.
可扩展、更容易检查和更新数据、让您只检索相关位、性能更好等。