我目前正在使用Python和Pandas从我的数据库中查询数据。我有一个查询来获取一些客户信息(这显然不是真正的查询,它简化了,没有联接等等):
def customer_query(con, date):
stmt = """
SELECT
first_name
last_name
dob
FROM
customer
"""
return pd.read_sql(
stmt,
con
)我这样做熊猫,以便我可以很容易地导出数据集到csv没有任何麻烦。
需求发生了变化,我需要根据客户周围的情况生成两个不同的数据集。原始查询仍然有效,我们仍然需要first_name、last_name等,所以我不想创建两个完全独立的查询。我想在查询中添加WHER-子句,如下所示:
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"},
)我不能将子查询放在带有参数的语句中。我想要做的是将子查询作为参数。通过这种方式,我可以将子查询作为参数传递,并生成两个不同的数据集。不过,这并不适用于熊猫。我唯一能想到的就是自己执行子查询,从中获取客户is并将它们传递给我的"customer_query“函数。这不如执行一个SQL语句中的所有内容好,但我没有其他想法。我也不想用f字符串或什么东西来构建sql语句。
编辑:我忘记提到我连接到一个Oracle,而"con“对象是一个cx_Oracle连接。显然,我对解决方案的想法是无效的,因为cx_Oracle并不真正支持将列表作为参数传递。
发布于 2020-02-25 11:13:58
您最好创建两个查询,以便优化器对每个查询进行调优。就像一切“视情况而定”。他们多久跑一次?连接是否保持打开(还有需要考虑的语句缓存),等等。
在Oracle SQL中,绑定值不用于构建SQL语句(因此它们的安全性好处)。
https://stackoverflow.com/questions/60391824
复制相似问题