def customer_query(con, date):
stmt = """
SELECT
first_name
last_name
dob
FROM
customer
where id in (:sub)
"""
return pd.read_sql(
stmt,
con,
params={"sub": "SELECT customer_id FROM different_table_1"},
)
I不能仅仅将supquery放在用参数的语句中。我希望做的是将子查询作为参数。 这样,我可以将子查询作为参数传递,并生成两个不同的数据集。不过,这与大熊猫不起作用。 我唯一能想到的是独立执行子查询,从中获取客户ID并将其传递给我的“ customer_query”功能。这不像在一个SQL语句中执行所有内容那样好,但是我没有其他想法。我还避免了用f字符串或其他东西构建SQL语句的想法。
Edit: 我忘了提到我连接到Oracle DB,而“ con”对象是cx_oracle连接。 显然,我对解决方案的想法无效,因为cx_oracle并不真正支持将列表作为参数传递。 您可能会更好地创建两个查询,因此优化器调整每个查询。 就像一切“取决于”一样。 他们多久运行一次? 连接是否保持打开状态(还需要考虑语句缓存)等。
在Oracle SQL中,绑定值不用于构建SQL语句(因此其安全益处)。
启用参数,我们可以简单地将其替换为以下:
stmt = """
SELECT
first_name
last_name
dob
FROM
customer
where id in (<<sub>>)
"""
stmt = stmt.replace("<<sub>>", "SELECT customer_id FROM different_table_1")