【问题标题】:Postgres SQL state: 22P02 - invalid input syntax for integerPostgres SQL 状态:22P02 - 整数的无效输入语法
【发布时间】:2020-09-07 17:26:00
【问题描述】:

我正在使用 sql 查询从我公司的程序中导出数据库。 一切似乎都很好,直到我将“where”声明中的日期更改为前一个。 请在下面找到代码:

SELECT p."Index", p."PSN" || CAST(p."PNR"as int) AS ID, 
p."PSN" AS Serie, cast(p."PNR"as int) AS Numar, 
pr."PINDate" AS r_gdate, 
CASE WHEN pr."AsigEID"='10' THEN pr."PrimSUM" ELSE 
    pr."PrimSUM"*valuta1."EXCValue" END AS r_prima_lei, 
CASE WHEN pr."AsigEID"='2' 
        THEN pr."PrimSUM"
      ELSE CASE WHEN pr."AsigEID"='10' THEN pr."PrimSUM"/valuta2."EXCValue"
           ELSE pr."PrimSUM"*valuta1."EXCValue"/valuta2."EXCValue"
           END 
    END AS r_prima_eur,
CASE WHEN pr."AsigEID"='10' THEN pr."AsigSUM" ELSE 
    pr."AsigSUM"*valuta1."EXCValue" END as r_sa_lei,
CASE WHEN pr."AsigEID"='2' 
        THEN pr."AsigSUM"
      ELSE CASE WHEN pr."AsigEID"='10' THEN pr."AsigSUM"/valuta2."EXCValue"
           ELSE pr."AsigSUM"*valuta1."EXCValue"/valuta2."EXCValue"
           END 
    END AS r_sa_eur,
pr."AsigStart", pr."AsigEnd", risc."Code", plink."Index"
FROM "PolsRisc" AS pr 
LEFT JOIN "Pols" as p ON p."Index" = pr."PID"
LEFT JOIN "Riscs" as risc ON pr."RID" = risc."Index"
LEFT JOIN "PRLNK" plink ON plink."PTID" = p."PTID" AND plink."RID" = risc."Index"
LEFT JOIN "EXCValues" valuta1 ON valuta1."AtDate" = pr."AsigStart" AND valuta1."EID" = pr."AsigEID"
LEFT JOIN "EXCValues" valuta2 ON valuta2."AtDate" = pr."AsigStart" AND valuta2."EID"='2'
WHERE pr."PINDate" > '2020-08-01' AND pr."IsRezil" = 'false';

当我使用“2020-08-01”时,查询运行良好。当我尝试将其更改为以前的例如。 '2010-01-01' 得到一个错误:

ERROR:  invalid input syntax for integer: ""
SQL state: 22P02

我在以前的帖子中寻找解决方案,但我没有设法解决这个问题。

【问题讨论】:

  • 我认为问题是由于结合了您的数据和查询而出现的。不在日期选择中。设置“2010-01-01”后,计算的数据量比设置“2020-08-01”时要多。您的列数据类型之类的东西是整数,您在查询中将其用作字符串,反之亦然
  • 只使用 2020-08-01 的日期函数,比如这个 date('Y-m-d', strtotime("2020-08-01"))

标签: sql postgresql


【解决方案1】:

看起来它正在将""null 值返回到您使用整数逻辑的列之一。日期更改只是过滤掉会使其崩溃的数据。

您可能需要使用合并将nulls 重新分配为0,然后将其重新转换为int

select
    cast(coalesce(table.column, 0) as int) as result
from table

【讨论】:

  • 看来你是对的。现在错误来自“被零除”。因此有一个空值或“”。我将尝试找到解决这两种情况的解决方案。你的解决方案给我带来了除法错误。
  • 我试图使用 NULLIF(column, 0) 但它不起作用
  • 您可以只检查它是否为零,如果它不为零,则仅除以。附带说明一下,如果以这种方式使用 NULLIF 和 COALESCE 将做同样的事情,它们都将 null 值替换为 0
  • 我发现了这个问题。它来自 SELECT p."Index", p."PSN" || CAST(p."PNR"as int) AS ID, p."PSN" AS Serie, cast(p."PNR"as int) AS Numar,
  • Rad 新闻,乐于助人
【解决方案2】:

我建议阅读 http://www.postgresql.org/docs/current/interactive/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS 章节 .这是一个简短且内容丰富的阅读。错误消息的原因是 '' 是一个空字符串,在整数等数字类型中没有表示形式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多