SQLite 限制是一个字符串

SQLite limit is a string

Android API docs 似乎表明查询 SQLite 数据库时提供的限制子句是一个字符串。
这对我来说意义不大。
估计是内部转成整数了吧?
还是这里涉及到其他问题?

我认为他们要考虑的关键是该参数不仅适用于单个第一部分(请参阅下面的 expr1),而且适用于整个 LIMIT 子句 .

这个子句可以简单到一个整数,也可以比较复杂; LIMIT 子句的完整语法是:-

LIMIT expr1 OFFSET (or ,) expr2; see - SELECT

其中:-

  • expr1 应解析为指定要返回的最大行数的整数,并且
  • expr2 是一个整数,它指定从要返回的潜在行开始的偏移量(其中 1 是第一个)。
  • 至少在理论上,任何一个表达式都可以是子查询,例如

    • String limit_clause = "(SELECT numbertoshow FROM types WHERE id = (random() & 1)+1)";
    • P.S。并不是说这是一个有用的示例,而是一个有效的示例,用于说明复杂的 LIMIT 子句,并且作为一个示例说明为什么 String 而不是 Integer 是更多 flexible/useful 参数类型。


用于测试以上内容的完整 SQL 是:-

/*
DROP TABLE IF EXISTS basetable;
CREATE TABLE IF NOT EXISTS basetable (basename TEXT);
INSERT INTO basetable VALUES('test001');
INSERT INTO basetable VALUES('test002');
INSERT INTO basetable VALUES('test003');
INSERT INTO basetable VALUES('test004');
INSERT INTO basetable VALUES('test005');
INSERT INTO basetable VALUES('test006');
INSERT INTO basetable VALUES('test007');
INSERT INTO basetable VALUES('test008');
INSERT INTO basetable VALUES('test009');
INSERT INTO basetable VALUES('test010');
INSERT INTO basetable VALUES('test011');
INSERT INTO basetable VALUES('test012');
DROP TABLE IF EXISTS types;
CREATE TABLE IF NOT EXISTS types (id INTEGER PRIMARY KEY, typename TEXT, numbertoshow INTEGER);
INSERT INTO types VALUES(null,'type001',3);
INSERT INTO types VALUES(null,'type002',4);
*/
SELECT * FROM basetable LIMIT (SELECT numbertoshow FROM types WHERE id =  (random() & 1)+1);
  • 注意注释掉的语句被注释掉,因为它们只需要一次。