首页 > 解决方案 > 使用 order 和 where 子句在表中查找偏移量

问题描述

考虑以下模式和表:

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%' 名称的 rowid(在有序列表中)。这将返回:

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

我的问题是,是否有一个 SQL 语句可以返回 OFFSET 值(在其 4 以上的 R 情况下)给定一个起始的第一个字母?(我真的不想通过结果使用 stepping() 来计算行数,直到达到第一个 'R%'!)

我尝试了以下但没有成功:

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

它总是返回单行 NULL 数据。

作为背景,这个表是一个电话簿列表,我想将结果的子集(来自主表)提供给调用者,从初始字母偏移量开始。

标签: sqlite

解决方案


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

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

推荐阅读