使用LIMIT与SQLite分页

时间:2013-06-27 10:34:59

标签: sql sqlite limit

我正在编写自己的SQLIteBrowser,我有一个最后的问题,显然经常在网上讨论,但它似乎没有一个很好的通用解决方案。

所以目前我存储了用户输入的SQL。每当我需要获取行时,我通过在SQL的末尾添加“Limit n,m`来执行SQL。

对于我主要使用的普通SQL,这似乎已经足够了。但是,如果我想在查询中使用limit,这显然会产生错误,因为生成的sql看起来像这样:

 select * from table limit 30 limit 1,100

这显然是错误的。有没有更好的方法来做到这一点?

我的想法是,我可以扫描SQL并检查是否已经使用了限制条款然后忽略它。当然它并不像那样简单,因为如果我有这样的sql:

 select * from a where a.b = ( select x from z limit 1)
在这种情况下,它显然应该仍然应用我的限制,所以我可以从最后扫描字符串并查看是否存在限制。我现在的问题是,这是多么可行。由于我不知道SQL解析器的工作原理,我不确定LIMIT是否必须在SQL的末尾,或者最后是否还有其他命令。

我使用order bygroup by对其进行了测试,如果limit不在最后,我会收到SQL错误,所以我的假设似乎是正确的。

1 个答案:

答案 0 :(得分:4)

我现在发现了一个更好的解决方案,它非常简单,不需要我解析SQL。

用户可以输入任意sql。结果将加载到表中。由于我们不想一次加载整个结果,因为这可以返回数百万条记录,因此只会记录N条记录。当用户滚动到表格的底部时,将获取下N个项目并将其加载到表格中。

解决方法是将SQL封装到具有页面大小限制的外部sql中。

 select * from (arbitrary UserSQL) limit PageSize, CurrentOffset

我使用我经常使用的SQL测试它,这看起来效果很好,并且对我的目的也足够快。

但是,我不知道SQLite是否有更快获取新行的机制,或者每次都必须重新运行sql。在这种情况下,对于具有较长响应时间的复杂查询来说,它可能不是一个好的解决方案。