我正在编写自己的 SQLIteBrowser,我有一个最后一个问题,显然在网络上经常讨论这个问题,但它似乎没有一个好的通用解决方案。
所以目前我存储用户输入的 SQL。每当我需要获取行时,我通过在 SQL 末尾添加“限制 n,m”来执行 SQL。
对于我主要使用的普通 SQL,这似乎已经足够好了。但是,如果我想在查询中使用限制自己,这显然会出错,因为生成的 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 by
and测试了它,group by
如果不是在最后,我会得到 SQL 错误limit
,所以我的假设似乎是正确的。