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

如何将pandas DataFrame列值传入SQL查询语句的IN运算符中

方案1:直接拼接符合SQL语法的IN子句

你之前的写法没有给每个字符串值加单引号,导致SQL无法识别为独立的字符串参数,正确拼接方式如下:

# 为每个用户编号包裹单引号,再用逗号拼接
in_params = "','".join(data_frame['uniq_num'].tolist())
# 构造完整SQL
sql = f"""
SELECT users FROM database
WHERE users IN ('{in_params}')
"""

拼接完成后的SQL IN部分会自动生成符合要求的格式:IN ('1qw3','2wed','3das','4frr','533ew','612w'),可直接执行。

注意:如果用户编号中本身包含单引号,需要先做转义处理,将每个单引号替换为两个单引号,避免SQL语法错误;同时部分数据库对IN子句的元素数量有限制(如Oracle上限为1000个),若数据量过大会触发报错。


方案2:参数化查询(更安全,推荐)

如果使用Python数据库驱动或pandas执行查询,优先使用参数化写法,可避免SQL注入风险,也无需手动处理引号:
以SQLAlchemy + pandas的场景为例:

from sqlalchemy import text
import pandas as pd

# 构造参数字典,直接传入列表即可
params = {"user_list": data_frame['uniq_num'].tolist()}
# 编写带占位符的SQL
query = text("SELECT users FROM database WHERE users IN :user_list")
# 执行查询
result_df = pd.read_sql(query, con=你的数据库连接对象, params=params)

补充说明:为什么之前STRING_SPLIT写法不生效

STRING_SPLIT是表值函数,返回的是单列的结果集,正确的写法应该是WHERE users IN (SELECT value FROM STRING_SPLIT(?, ',')),但这种写法性能远低于上述两种方案,且需要额外处理参数传入,不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:36:03