0

我正在研究一个 SQLite DB 表,其中包含“名字”、“姓氏”字段和由(姓氏,给定)形成的索引。主索引只是一个整数名称 ID。我想找到以搜索参数(字符串)开头的第一个姓氏,

SELECT Given, Surname FROM NameTable WHERE Surname>'C' LIMIT 1

然后通过 Surname+Given 索引向前或向后一步,一次一行。我已阅读 SQLite“滚动光标”文章,但该解决方案不太适合我的程序结构。保存最近检索到的姓氏,然后查询小于这个姓氏的姓氏将不起作用,因为它可能会跳过最近名字之前但具有相同姓氏的几个名字。

由于这是基于一个简单的索引,因此应该可以单步执行该索引。是否可以直接引用索引的 ROWID(而不是表本身)?例如,假设您刚刚检索到与索引的第 1234 行对应的记录,并希望返回,您将如何完成这样的事情:

SELECT Given, Surname FROM NameTable WHERE ROWID<1234 (I realize this ROWID will refer to the table, not the index)

该表将包含以下条目:

史密斯,安倍
史密斯,巴尼
史密斯,玛丽
史密斯,迈克
...

我认为我不能使用准备/步骤方法,因为在滚动之间可能会有很多针对数据库的查询。

作为替代方案,如何创建连接 Surname 和 Given 的搜索参数?我可以用它作为占位符。

在此先感谢,并为成为 SQL 新手而道歉。

4

2 回答 2

0

首先,您不想要“索引的rowid”,因为那是无稽之谈;索引在这种意义上没有 rowid,并且您不会对它们进行搜索(相反,它们用于加速对表的搜索)。您需要该行的 rowid,并且可以与 Given 和 Surname 列同时获得它。获得 ROWID 后,您可以通过查找 ROWID 大于给定(前一个)的第一行来获取下一行,并且该行也与其他条件匹配。这将是一个相当有效的查询(或者至少不会比原来的查询差多少)。

如果事情变得非常复杂,请将相关数据复制到临时表中并对其进行分页。完成初始查询后,您会发现速度更快。

于 2013-01-03T01:22:15.067 回答
0

连接字符串称为“连接”。SQLite 中的连接运算符是“||”。这是将多列连接成一列的示例。

select
  Given || " " || Surname as "Full Name"
from
  NameTable;

如果要为每一行保留唯一标识符,还可以选择(隐式)“ROWID”列。还可以选择单个名称列、聚合列和“ROWID”列来获得完整的数据集。

select
  ROWID,
  Given,
  Surname,
  Given || " " || Surname as "Full Name"
from
  NameTable;

关于搜索的问题涉及更多,因为我不清楚您要完成什么。此外,在用户输入搜索条件的情况下,可以以许多不同的方式提供输入,例如部分或完整的名字或姓氏、部分或完整的名字和姓氏、给定和姓氏的顺序颠倒等。(复杂的搜索)。

因此,根据您允许输入的方式,您可以以不同的方式进行搜索。最简单的方法是使用“like”运算符。根据数据集的大小,您可能能够创建一个虚拟表,将 Given 和 Surname 列连接成单个列,并使用该列进行类似比较。或者,您可以使用“OR”运算符来允许匹配 Given 或 Surname 列。

您可能还想知道 SQLite 支持全文搜索引擎。 http://www.sqlite.org/fts3.html

于 2013-01-03T01:38:48.500 回答