我有一个相当大的表,有几百万行。我正在尝试编写一个高效的代码,该代码将选择其中两列具有从 python 代码传递给它的对列表中的值的行。合理的答案是 posted .
例如
select *
from table
where convert(id1) + '-' + id2 in ('2261-7807403','2262-9807403' )
返回的表通过pd.read_sql_query
放入数据帧。我这里有两个问题(除了速度慢之外)。一,id2
可以为 NULL
,并且这些行的查询失败。另一个更重要的问题是 where
子句中元组列表的大小可能变化很大,从 1 到数百万。
我的理解是,在大列表的情况下,最好使用 pandas 将整个列导入到 python 中,然后在那里过滤它们。但是如何使少量列表和大量列表之间的过渡顺利呢?有没有办法通过 SQL Server 和 Python 的巧妙结合来做到这一点?
最佳答案
您应该使用正确的类型传递值。一种方法是构造派生表并使用join
:
select t.*
from table t join
(values (2261, 7807403), . . .
) v(id1, id2)
on t1.id1 = v.id1 and t.id2 = v.id2;
您不应该将值转换为字符串进行比较。这不仅“荒谬”,而且会严重影响性能。
对于NULL
,除非你有特殊的逻辑,否则它们不会匹配。 SQL 没有空安全比较。
select t.*
from table t join
(values (2261, 7807403), . . .
) v(id1, id2)
on (t1.id1 = v.id1 or t1.id1 is null and t2.id2 is null) and
(t.id2 = v.id2 or t1.id1 is null and t2.id2 is null);
请注意,这可能会影响执行计划。
关于sql - 使用对列表有效地选择 SQL Server 中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59868500/