sql - 使用对列表有效地选择 SQL Server 中的行?

标签 sql sql-server python-3.x pandas

我有一个相当大的表,有几百万行。我正在尝试编写一个高效的代码,该代码将选择其中两列具有从 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/

相关文章:

SQL查询解决方案

mysql - 连接表sql的问题

python - 设置类中对象的名称

c++ - 小数或 float (SQL Server 和 C++)

linux - 如何在 MAC 操作系统上将 Vertica 连接到 Python?我需要 Unix 还是 Linux 脚本?

python - Pandas:一列具有重复组到多列

asp.net - 服务器标记的格式不正确。查询字符串和数据绑定(bind)

mysql - 全外连接的SQL查询

c# - DateTime 时间戳有句点而不是冒号

sql-server - 在此上下文中不能使用返回值