首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Insert语句中使用类型转换和条件插入到表中

在Insert语句中使用类型转换和条件插入到表中
EN

Stack Overflow用户
提问于 2019-05-22 23:32:36
回答 2查看 925关注 0票数 0

基于this previous question

我正在尝试使用psycopg2和一些数据在Python语言中编写一个insert语句。这个查询在postgresql控制台上运行得很好,但是当我在psycopg2中尝试它的时候,我得到了一个错误。

这是我想要插入的表

create_test_table = """CREATE TABLE persons(
   name           VARCHAR,
   age            INT,
   dob            DATE,
   sex            VARCHAR);"""

下面是我想要插入的数据

d_ = {"name":"Gino", "age": "", "dob": "na", "sex": "M"}

下面是我的问题:

cur.execute("""INSERT INTO persons (age,dob,sex,name) 
               VALUES (CASE WHEN cast(%(age)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(age)s END,
                       CASE WHEN cast(%(dob)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(dob)s END,
                       CASE WHEN cast(%(sex)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(sex)s END,
                       CASE WHEN cast(%(name)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(name)s END)""", d_)

错误消息:

----> 5  CASE WHEN cast(%(name)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(name)s END)""", d_)

ProgrammingError: column "age" is of type integer but expression is of type text
LINE 2:                VALUES (CASE WHEN cast('' as text) IN ('', '#...
                               ^
HINT:  You will need to rewrite or cast the expression.

也许在psycopg2中不可能做到这一点。如有任何帮助,我们将不胜感激:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-23 06:02:48

错误是由于CASE表达式(即您试图插入的值)是文本的结果,而age列是整数。

要直接解决这个错误,可以简单地将表达式转换为INTEGER

CASE WHEN cast(%(age)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(age)s END::INTEGER

CAST(CASE WHEN cast(%(age)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(age)s END AS INTEGER)

但是,除非当该字段不是整数,并且不是您特别排除的('', '#', '-', '--', '??')值之一时,您实际上想要一个无效的强制转换异常,否则您可能希望将此特定语句重写为:

CASE WHEN age::TEXT ~ '^[\d]+$' THEN age ELSE NULL END::INTEGER

因此,在尝试转换它之前,请检查它是否确实是一个数字,如果它不是一个数字,则将其设为空。但无论哪种方式,您只需转换结果即可。注您可能需要对dob列执行相同的操作。

票数 1
EN

Stack Overflow用户

发布于 2019-05-22 23:44:14

您的参数替换不正确。例如,而不是这样:

%(CASE WHEN cast(age as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE age END)s

你应该有:

(CASE WHEN cast(%(age)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE age END)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56260366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档