我正在开发一个SQLite数据库表,其中包含字段“Given name”,“Surname”和由(Surname,Given)组成的索引。主索引只是一个整数名称ID。我想找到以搜索参数(字符串)开头的第一个姓氏,
SELECT Given, Surname FROM NameTable WHERE Surname>'C' LIMIT 1
然后通过Surname + Given索引前进或后退,一次一行。我已经阅读了SQLIte“Scrolling Cursor”article,但该解决方案并不适合我的程序结构。保存最近检索到的姓氏,然后查询小于此姓氏的姓氏,将无法正常工作,因为它可能会跳过最近名称前面的多个姓名,但姓氏相同。
由于这是基于一个简单的索引,因此应该可以单步执行索引。是否可以直接引用索引的ROWID(而不是表本身)?例如,假设您刚刚检索到与索引的第1234行相对应的记录,并希望向后转,那么您将如何完成以下任务:
SELECT Given, Surname FROM NameTable WHERE ROWID<1234 (I realize this ROWID will refer to the table, not the index)
该表格将包含以下条目:
SMITH, ABE SMITH, BARNEY SMITH, MARY SMITH, MIKE ...
我认为我不能使用prepare / step方法,因为在滚动之间可能会有很多针对数据库的查询。
作为替代方案,如何制作一个连接Surname和Given的搜索参数?我可以将它用作占位符。
提前致谢,并为成为SQL新手而道歉。
答案 0 :(得分:0)
首先,你不想要“索引的rowid”,因为那是胡说八道;索引没有那种意义上的rowid,你不会对它们进行搜索(相反,它们用于加速对表的搜索)。你想要行的rowid,你可以在Given和Surname列的同时得到它。获得ROWID后,可以通过查找ROWID大于给定(前一个)的第一行来获取下一行,并且该行也匹配其他条件。这将是一个相当有效的查询(或者至少比原始查询差得多)。
如果事情变得非常复杂,请将相关数据复制到临时表中并对其进行分页。初步查询完成后,您会发现速度更快。
答案 1 :(得分:0)
加入字符串称为“连接”。 SQLite中的连接运算符是“||”。这是将多个列连接到一个列中的示例。
select
Given || " " || Surname as "Full Name"
from
NameTable;
如果要为每行保留唯一标识符,还可以选择(隐式)“ROWID”列。也可以选择单个名称列,聚合列和“ROWID”列以获得完整数据集。
select
ROWID,
Given,
Surname,
Given || " " || Surname as "Full Name"
from
NameTable;
关于搜索的问题涉及更多,因为我不清楚你想要完成什么。此外,在用户输入搜索标准的情况下,可以以许多不同的方式提供输入,例如,部分或完整的名字或姓氏,部分或完整的名字和姓氏,在给定和姓氏上反转的命令等(使搜索复杂化)。
因此,根据您允许输入的方式,您可以以不同的方式进行搜索。最简单的方法是使用“喜欢”操作符。根据数据集的大小,您可以创建一个虚拟表,将Given和Surname列连接到一个列中,并使用该列进行类似的比较。或者,您可以使用“OR”运算符来允许匹配Given或Surname列。
您可能还想知道SQLite支持全文搜索引擎。 http://www.sqlite.org/fts3.html