【问题标题】:SQLite limit is a stringSQLite 限制是一个字符串
【发布时间】:2018-02-14 11:40:45
【问题描述】:

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

【问题讨论】:

    标签: android android-sqlite sql-limit


    【解决方案1】:

    我认为他们要考虑的关键是该参数不仅适用于单个第一部分(参见下面的 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)";
      • 附注并不是说这是一个有用的示例,而是一个有效的示例,用于说明复杂的 LIMIT 子句,并作为这样的示例说明为什么与 Integer 相比,String 是更灵活/有用的参数类型。


    用于测试上述内容的完整 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);
    
    • 注释掉的语句被注释掉,因为它们只需要一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多