我有一个非常大的数据库,我正在使用它,我需要知道如何选择一大组没有任何真实模式的 ID。这是我到目前为止的代码段:
longIdList = [1, 3, 5 ,8 ....................................]
for id in longIdList
sql = "select * from Table where id = %s" %id
result = cursor.execute(sql)
print result.fetchone()
我当时在想,一定有一种更快的方法来做到这一点……我的意思是我的脚本需要搜索一个拥有超过 400 万个 ID 的数据库。有没有一种方法可以让我使用选择命令一次将它们全部抓取。我可以使用带有 id 列表的 where 语句吗?谢谢
请您参考如下方法:
是的,您可以使用 SQL 的 IN() 谓词将列与一组值进行比较。这是标准 SQL,每个 SQL 数据库都支持它。
在 IN() 谓词变得效率太低或仅仅超过 SQL 查询的长度限制之前,您可以在其中放入的值的数量可能存在实际限制。最大的实用值列表取决于您使用的数据库(在 Oracle 中为 1000,在 MS SQL Server 中为 2000 左右)。我的感觉是,如果您的列表超过几十个值,我会寻求其他解决方案。
例如,@ngroot 建议在他的回答中使用临时表。关于此解决方案的分析,请参阅 StackOverflow 常规博客 @Quassnoi : Passing parameters in MySQL: IN list vs. temporary table .
以安全的方式将值列表参数化到 SQL 查询中可能很棘手。您应该注意 SQL injection 的风险.
另请参阅 Stack Overflow 上的这个热门问题:Parameterizing a SQL IN clause?
