在SQLite WHERE子句中组合了大量条件

Mar*_*ski 2 sql sqlite performance

我需要检索与列表中存储的ID匹配的记录.在运行时生成的查询很简单:

SELECT [whatever FROM sometable] WHERE (id = 1) or (id = 5) or (id = 33).
Run Code Online (Sandbox Code Playgroud)

这相当于

SELECT [whatever FROM sometable] WHERE [id] IN (1, 5, 33);
Run Code Online (Sandbox Code Playgroud)

这很好,但如果列表包含数百或数千个ID怎么办?声明将是巨大的,并且在某些时候SQL解析器可能会呱呱叫,或者如果它没有,性能可能会非常糟糕.如何以对检索的记录数量不那么敏感的方式执行此操作?

(我不能只循环遍历列表并逐个检索记录的原因是我需要数据库为我做ORDER BY.记录必须来自特定字段排序的数据库,而列表表示由网格中的用户可以通过多种方式进行排序.是的,我可以在检索后对代码中的记录进行排序,但这是计划B,因为我甚至不需要将它们全部保存在一个数据结构中,只是为了正确订购.)

pax*_*blo 5

如果您真的要拥有这么多ID,那么您担心SQL解析器会出现问题,您可以将它们存储到临时表中并进行交叉连接.

只需使用一个(主键)列创建表,然后使用所需的ID填充它,并使用以下内容:

SELECT [whatever] FROM [sometable] st, [idtable] it
WHERE st.id = it.id
Run Code Online (Sandbox Code Playgroud)

该查询不会阻塞任何解析器,并且检索的行将限于那些在临时表中具有ID的行.

这不是一个临时表,当然,你可以让它躺在身边只要你保证只有一个"东西"使用它一次.