【问题标题】:Convert "None" string to null during Oracle insert在 Oracle 插入期间将“无”字符串转换为空
【发布时间】:2020-10-14 20:12:16
【问题描述】:

我有一个具有以下值的数据框 (df)。注意下面的项目代码是字符串“None”

   YEAR    QUARTER    ID          AMOUNT       DATE       COMMENTS  PROJECT_CODE
0  2020        3     ABC            300.0   2020-10-07      N/A       ABC_0001
0  2020        3     ABC            500.0   2020-10-07      N/A          None

我想在使用以下查询插入 oracle 表之前将“无”转换为无:

con3 = cx_Oracle.connect(connstr)
cur3 = con3.cursor()
rows3 = [tuple(x) for x in df.values]
cur3.executemany('''merge into O_TABLE
                   using dual
                   on (YEAR = :1 and QUARTER = :2 and ID = :3 and AMOUNT = :4 and DATE = :5 and COMMENTS = :6 and PROJECT_CODE = :7)
                   when not matched then insert values (:1, :2, :3, :4, :5, :6, :7)
                   where :3 IS NOT NULL''',rows)
con3.commit()
cur3.close()
con3.close()

我想在 Oracle 表上插入一个空值来代替“无”。我尝试在插入之前将“无”转换为Nan,但这似乎会导致错误:

df['PROJECT_CODE'] = df['PROJECT_CODE'].replace('None', np.nan)
Error:
Traceback (most recent call last):
  File "./test_program.py", line 266, in <module>
    where :3 IS NOT NULL''',rows3)
TypeError: expecting string or bytes object

如何为我的 df 中的所有“无”值在 oracle 表中插入一个真正的空值?我不想使用 to_sql,因为这限制了我编写 sql 查询的方式。谢谢。

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

Oracle 很乐意将空字符串用作 null,并且当您将来进行比较时,空字符串等同于 null。

您可以只传入一个空字符串,但是您还需要使用“PROJECT_CODE”进行比较,或者使用

and NVL(PROJECT_CODE, '''None''') = :7

and ((:7 is null and PROJECT_CODE is null) or PROJECT_CODE = :7)

例如

con3 = cx_Oracle.connect(connstr)
cur3 = con3.cursor()
rows3 = [tuple(x) for x in df.values]
cur3.executemany('''merge into O_TABLE
                   using dual
                   on (YEAR = :1
                       and QUARTER = :2
                       and ID = :3
                       and AMOUNT = :4
                       and DATE = :5 
                       and COMMENTS = :6 
                       and ((:7 is null and PROJECT_CODE is null) or PROJECT_CODE = :7)
                   )
                   when not matched then insert values (:1, :2, :3, :4, :5, :6, :7)
                   where :3 IS NOT NULL''',rows)
con3.commit()
cur3.close()
con3.close()

【讨论】:

  • 谢谢。我在'''None''' 上遇到语法错误。 ` on (YEAR = :1 and QUARTER =:2 and ID = :3 and AMOUNT = :4 and DATE = :5 and COMMENTS = :6 and NVL(PROJECT_CODE, '''None''') = NVL(:7 , '''无''') ^ SyntaxError: invalid syntax `
  • 我认为您可能需要使用较少的引号,例如'' 或更多引号 '''' ...但我猜的更少。
  • 尝试使用上面“或”之后的版本,不确定单引号是如何转换的
  • 我已经改变了我的例如在上面的答案中使用替代方法
猜你喜欢
  • 2015-04-25
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多