You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Pandas DataFrame列内容自动转换为SQL查询的IN条件

实现方案

有三种常用的落地方式,可根据实际数据量选择:

方案1:直接格式化字符串(适合小数据量、Name无特殊字符场景)

先把Name列转为带单引号的逗号分隔字符串,直接拼入SQL即可:

# 提取Name列去重后的值
name_list = df["Name"].unique().tolist()
# 格式化为 'Sam','Tom','Roy' 符合SQL语法的字符串
formatted_names = ",".join([f"'{name}'" for name in name_list])

# 拼接查询语句
query = f'''select Age
           from xxx
           where Name in ({formatted_names})'''
age = pd.read_sql(query, conn)

如果Name字段值本身包含单引号,需要先做转义避免语法错误:

formatted_names = ",".join([f"'{name.replace("'", "''")}'" for name in name_list])

方案2:参数化查询(推荐,安全无注入风险、无需处理特殊字符)

用pd.read_sql自带的参数传递能力,无需手动处理字符串转义:

name_list = df["Name"].unique().tolist()
# 生成对应数量的参数占位符
placeholders = ",".join(["?"] * len(name_list))

query = f'''select Age
           from xxx
           where Name in ({placeholders})'''
# 把name列表作为参数传入执行
age = pd.read_sql(query, conn, params=tuple(name_list))

方案3:临时表关联(适合IN列表超过Teradata长度限制的场景)

Teradata默认IN子句最多支持1024个值,当Name数量较多时,先把Name列表写入临时表再关联查询更稳妥:

# 将Name列写入临时表,可提前去重减少冗余
df[["Name"]].drop_duplicates().to_sql("temp_name_list", conn, if_exists="replace", index=False)

# 关联查询
query = '''select a.Age
           from xxx a
           inner join temp_name_list b on a.Name = b.Name'''
age = pd.read_sql(query, conn)

内容的提问来源于stack exchange,提问作者Chilam Cheung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:00:01