【问题标题】:Using a column as a list in where clause in a sql query在 sql 查询的 where 子句中使用列作为列表
【发布时间】:2023-02-07 09:11:23
【问题描述】:

我使用 python 中的 a 列创建了一个列表。我正在尝试在 sql 查询中的 where 子句中。列表是帐号列表。

从 df 创建列表

data1
acc_d1= data1['ACCOUNT_NUMBER']
t1 = tuple(acc_d1)

我在 python 中的 sql 查询代码(我正在使用 zeppelin)

sql="""
select id_number from table
where account_number IN {}""".format(t1)
prog_list_d1 = pd.read_sql(sql, dbc)

当我通过手动输入数字创建列表时

acc_d1 = [12129530695080,12129530755769,12129516984649......]
t = tuple(acc_d1)

sql="""
select id_number from table
where account_number IN {}""".format(t)
prog_list_d1 = pd.read_sql(sql, dbc)

它工作得很好。我在飞艇笔记本中使用 python,数据是从 Oracle 数据库中提取的

【问题讨论】:

  • 试试t1 = acc_d1.tolist()
  • @oskros 是否定的。这是行不通的
  • t1 = acc_d1.astype(int).tolist() 怎么样 - 如果不起作用,错误是什么?
  • ORA-01722: 号码无效

标签: python sql plsql apache-zeppelin


【解决方案1】:

您需要在列表周围加上括号。我不知道 Python,但我猜它会很简单:

sql="""
select id_number from table
where account_number IN ({})""".format(t)

顺便说一下,真的要尽量避免这种模式。 IN 子句中的变长列表会导致游标共享出现大问题,并且很难在共享池中使用。如果这种情况频繁发生,您的 DBA 将不会高兴。一次提取一个帐号要好得多,或者如果您需要数百万,则加载一个包含帐号的临时表,然后使用从那里连接到您的主表以一次性获取您想要的所有行,而无需列出它们在 SQL 本身中。

【讨论】:

    猜你喜欢
    • 2016-10-30
    • 2019-08-03
    • 2018-12-12
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多