选择SQLite查询中的特定行?

时间:2018-10-01 21:45:56

标签: sqlite

我试图了解在一个查询中从表中获取特定行的最佳方法是什么。

假设我的表格列是:

姓名,年龄,国家

假设它有1000行。然后,我有一个代表行的索引数组:

[2,10,20,34,50,120,400,410,444,810]

如何获得相应的名称?因此,[第2行的名称,第10行的名称,....]

我在网上看到了这样的东西:

SELECT * FROM `posts` WHERE `id` IN (5,6,7,8,9,10)

但是,我没有id列...在拉出类似的东西之前我需要操纵表或数据库吗?

1 个答案:

答案 0 :(得分:1)

以下方法(某种程度上)可以工作:-

SELECT * FROM `posts` WHERE rowid IN (5,6,7,8,9,10)

这是因为通常无处不在的 id 列通常是特殊(通常隐藏)的 rowid 列的别名。

这是一个未使用 WITHOUT ROWID 定义的表,将具有带有自动生成的ID的 rowid 列(除非通过以下方式指定或隐式指定了rowid)是 rowid 列的别名。

列的别名是通过指定 ?? INTEGER PRIMARY KEY 定义的(其中??表示有效的列名(通常为ID))。关键字 AUTOINCREMENT 可以补充INTEGER PRIMARY KEY,并添加一个约束条件,使生成的 id (即 rowid )< strong>必须增加,可以使用没有未使用的较低数字的(仅当最高ID为9223372036854775807时才相关)。使用 AUTOINCREMENT ,如果达到此最高ID,则将遇到SQLITE_FULL异常(不尝试首先选择一个较低的空闲数字)。

以上是SQLite Autoincrement的一些要点的总结。

示例演示

请考虑以下内容(最后两个SELECT查询等同于答案):-

DROP TABLE IF EXISTS rowid_demo1;
DROP TABLE IF EXISTS rowid_demo2;
CREATE TABLE IF NOT EXISTS rowid_demo1 (name TEXT, age INTEGER, country TEXT);
CREATE TABLE IF NOT EXISTS rowid_demo2 (id_column INTEGER PRIMARY KEY, name TEXT, age INTEGER, country TEXT);
INSERT INTO rowid_demo1 (name,age,country) VALUES
    ('Fred',22,'England'),('Mary',18,'Scotland'),('Heather',19,'Wales');
INSERT INTO rowid_demo2 (name,age,country) VALUES
    ('Fred',22,'England'),('Mary',18,'Scotland'),('Heather',19,'Wales');

SELECT *,rowid as rowid_column FROM rowid_demo1;
SELECT *,rowid as rowid_column FROM rowid_demo2;
INSERT INTO rowid_demo1 (rowid,name,age,country) VALUES
    (100,'George',21,'France');
INSERT INTO rowid_demo2 (rowid,name,age,country) VALUES
    (100,'George',21,'France');
SELECT *,rowid as rowid_column FROM rowid_demo1;
SELECT *,rowid as rowid_column FROM rowid_demo2;
-- Ridiculous to do the following but ??????
INSERT INTO rowid_demo2 (rowid,id_column,name,age,country) VALUES
    (500,501,'Beth',20,'Spain');
SELECT *,rowid as rowid_column FROM rowid_demo1;
SELECT *,rowid as rowid_column FROM rowid_demo2;

SELECT *,rowid AS rowid_column FROM rowid_demo1 WHERE rowid IN(2,3,100);
SELECT *,rowid AS rowid_column FROM rowid_demo2 WHERE rowid IN(2,3,100,501);

说明

此:-

  • 创建2个表(与rowid_demo2相同的其他表具有rowid列的别名)并-加载一些数据
  • 运行2个SELECT查询(每个表一个)以显示包括 rowid 列的行。 (结果1和2)
  • 更多数据已加载。但是,这次是通过指定 rowid
  • 的值
  • 运行相同的2个查询(结果3和4)
  • 一个荒谬的行被添加到第二个表中(给rowid及其别名都赋值)
  • 再次运行相同的2个查询(结果5和6)
  • 运行与答案等效的查询(结果7和8)。

演示结果:-

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here