使用order和where子句在表中查找偏移量

时间:2018-06-22 19:44:11

标签: sqlite

请考虑以下架构和表:

CREATE TABLE IF NOT EXISTS `names` (
    `id`    INTEGER,
    `name`  TEXT,
    PRIMARY KEY(`id`)
);
INSERT INTO `names` VALUES (1,'zulu');
INSERT INTO `names` VALUES (2,'bene');
INSERT INTO `names` VALUES (3,'flip');
INSERT INTO `names` VALUES (4,'rossB');
INSERT INTO `names` VALUES (5,'albert');
INSERT INTO `names` VALUES (6,'zuse');
INSERT INTO `names` VALUES (7,'rossA');
INSERT INTO `names` VALUES (8,'juss');

我通过以下查询访问该表:

SELECT *
FROM names
ORDER BY name
LIMIT 10
OFFSET 4;

使用偏移量4的地方,因为它是第一个出现的“ R%”名称的行标识符(在有序列表中)。这将返回:

1="7"   "rossA"
2="4"   "rossB"
3="1"   "zulu"
4="6"   "zuse"

我的问题是,是否有一条SQL语句可以返回给定的第一个字母,从而返回OFFSET值(在R情况下,大于4)? (我真的不希望在结果中使用step()来对行进行计数,直到达到第一个“ R%”!)

我尝试了以下操作但未成功:

SELECT MIN(ROWID)
FROM
(
    SELECT *
    FROM names
    ORDER BY name
)
WHERE name LIKE 'R%'

它总是返回单行的NULL数据。

作为背景,此表是电话簿列表,我想从主字母偏移开始,将结果的子集(从主表)提供给主叫方。

2 个答案:

答案 0 :(得分:1)

只计算感兴趣的字符串之前的行:

select count(*) from names where name < 'r';

答案 1 :(得分:0)

以下内容有许多选项。基本上,您的问题是子查询没有返回最小的 roiwd hencne NULL。但是,无需直接使用rowid,因为 id 列是 rowid 的别名,因此可以使用:-

SELECT name, id, MIN(rowid), min(id) -- shows how rowid and id are the same
FROM
(
    SELECT rowid, * -- returns rowid from the subquery so min(rowid) now works
    FROM names
    ORDER BY name
)
WHERE name LIKE 'R%' ORDER BY id ASC LIMIT 1 -- Will effectivley do the same (no need for the sub-query)

enter image description here

  • 添加了更多列进行演示。

因此,您的查询可能是:-

SELECT min(rowid) FROM names where name LIKE 'R%';

enter image description here

或:-

SELECT min(id) FROM names where name LIKE 'R%';

enter image description here

您还可以使用:-

SELECT id FROM names WHERE name LIKE 'R%' ORDER BY id ASC LIMIT 1;

或者:-

SELECT rowid FROM names WHERE name LIKE 'R%' ORDER BY id ASC LIMIT 1;