我需要在内存中存储大约 500-1000 个条目的 3 个字段,并通过 int 和 str 值进行快速有效的搜索。搜索发生在大约 300-500 个请求的快速突发中。我不确定如何有效地做到这一点。
存储的数据由 3 个字段组成:
有3种可能的情况:
目前,我使用两种不同的类型:
我发现这非常低效,目前正在寻找新的想法。任何提示?
当我将值插入表中时,我想将一些字段留空(即 Null)。我不明白为什么我想要一个字段中充满空字符串的数据库。
我使用 Delphi 10、FireDAC 和本地 SQLite DB。
编辑:提供的代码只是一个示例。在我的应用程序中,值由用户输入和函数提供,其中许多都是可选的。如果 value 为空,我想将其保留为 Null 或默认值。创建 ExecSQL 的多个变体和嵌套 If 语句也不是一个选项 - 可选字段太多(准确地说是 18 个)。
测试表:
CREATE TABLE "Clients" (
"Name" TEXT,
"Notes" TEXT
);
Run Code Online (Sandbox Code Playgroud)
这就是我尝试的方法:
var someName,someNote: string;
begin
{...}
someName:='Vasya';
someNote:='';
FDConnection1.ExecSQL('INSERT OR REPLACE INTO Clients(Name,Notes) VALUES (:nameval,:notesval)',
[someName, IfThen(someNote.isEmpty, Null, somenote)]);
Run Code Online (Sandbox Code Playgroud)
这引发了一个例外:
could not convert variant of type (Null) into type (OleStr)
Run Code Online (Sandbox Code Playgroud)
我尝试重载它并指定 [ftString,ftString] 但没有帮助。
目前我必须这样做,我讨厌这个凌乱的代码:
FDConnection1.ExecSQL('INSERT OR REPLACE INTO Clients(Name,Notes) VALUES ('+
IfThen(someName.isEmpty,'NULL','"'+Sanitize(someName)+'"')+','+
IfThen(someNote.isEmpty,'NULL','"'+Sanitize(someNote)+'"')+');');
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
Edit2:目前我看到一个使用“INSERT OR REPLACE”创建新行的选项,然后对每个非空值在一行中使用多个 UPDATE。但这看起来非常无效。像这样:
FDConnection1.ExecSQL('INSERT …Run Code Online (Sandbox Code Playgroud)