如何使用Python在SQL中选择一长串ID

1 投票
3 回答
8736 浏览
提问于 2025-04-16 03:52

我正在处理一个非常大的数据库,想知道怎么选择一大堆没有规律的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语句吗?谢谢

3 个回答

3

把这个列表以某种方式进行序列化,比如用逗号分隔或者用XML格式,这些都是不错的选择。然后在另一边创建一个存储过程,这个过程会把序列化后的列表反序列化,放到一个临时表里。接着,你就可以对这个临时表进行内部连接(INNER JOIN)操作了。

6

是的,你可以使用SQL中的IN()这个功能来把某一列和一组值进行比较。这是标准的SQL,所有的SQL数据库都支持这个功能。

不过,放在IN()里的值数量是有实际限制的,超过这个数量可能会导致查询效率变低,或者直接超过SQL查询的长度限制。具体能放多少个值,取决于你使用的数据库(比如在Oracle中是1000个,在MS SQL Server中大约是2000个)。我个人觉得,如果你的值列表超过几十个,最好考虑其他解决方案。

例如,@ngroot在他的回答中建议使用临时表。想了解这个解决方案的分析,可以看看StackOverflow常客@Quassnoi的这篇博客:在MySQL中传递参数:IN列表与临时表

把一组值安全地放入SQL查询中可能会有点棘手。你需要注意SQL注入的风险,这是一种常见的安全问题。

另外,看看Stack Overflow上这个热门问题:如何参数化SQL的IN子句?

5

你可以使用 IN 来同时查找多个项目:

SELECT * FROM Table WHERE id IN (x, y, z, ...)

所以可能像这样:

sql = "select * from Table where id in (%s)" % (', '.join(str(id) for id in longIdList))

撰写回答