【问题标题】:PostgreSQL ERROR: invalid input syntax for integer: "1e+06"PostgreSQL 错误:整数的无效输入语法:“1e+06”
【发布时间】:2016-11-09 17:47:43
【问题描述】:

完整的错误信息是:

ERROR: invalid input syntax for integer: "1e+06"
SQL state: 22P02
Context: In PL/R function sample

我使用的查询是:

WITH a as
(
 SELECT a.tract_id_alias,
     array_agg(a.pgid ORDER BY a.pgid) as pgids,
     array_agg(a.sample_weight_geo ORDER BY a.pgid) as block_weights
 FROM results_20161109.block_microdata_res_joined a
 WHERE a.tract_id_alias in (66772, 66773, 66785, 66802, 66805, 66806, 66813)
 AND a.bldg_count_res > 0 
 GROUP BY a.tract_id_alias

)
SELECT NULL::INTEGER agent_id, 
     a.tract_id_alias,
     b.year,
    unnest(shared.sample(a.pgids, 
                       b.n_agents, 
                       1 * b.year, 
                       True, 
                       a.block_weights)
                       ) as pgid
FROM a
LEFT JOIN results_20161109.initial_agent_count_by_tract_res_11 b
ON a.tract_id_alias = b.tract_id_alias
ORDER BY b.year, a.tract_id_alias, pgid;

而我正在使用的shared.sample 函数是:

CREATE OR REPLACE FUNCTION shared.sample(ids bigint[], size integer, seed integer DEFAULT 1, with_replacement boolean DEFAULT false, probabilities numeric[] DEFAULT NULL::numeric[])
  RETURNS integer[] AS
$BODY$
    set.seed(seed)
    if (length(ids) == 1) {
        s = rep(ids,size)
    } else {
        s = sample(ids,size, with_replacement,probabilities)
    }
    return(s)
$BODY$
  LANGUAGE plr VOLATILE
  COST 100;
ALTER FUNCTION shared.sample(bigint[], integer, integer, boolean, numeric[])
  OWNER TO "server-superusers";

我对这些东西很陌生,所以任何帮助都将不胜感激。

【问题讨论】:

  • 您应该 edit 提供相关信息:您在下面评论的内容、您的 Postgres 版本、当前架构搜索路径 (SHOW search_path) 以及显示相关数据类型的表定义。

标签: postgresql function casting integer plr


【解决方案1】:

不是功能的问题。就像错误消息所说:字符串'1e+06' 不能转换为integer

显然,表 results_20161109.initial_agent_count_by_tract_res_11 中的列 n_agents 不是 integer 列。可能输入textvarchar? (该信息将对您的问题有所帮助。)

无论哪种方式,赋值转换都不适用于目标类型integer。但它适用于numeric

不起作用:

SELECT '1e+06'::text::int;  -- error as in question

作品:

SELECT '1e+06'::text::numeric::int;

如果我的假设成立,您可以将此作为垫脚石。
将查询中的 b.n_agents 替换为 b.n_agents::numeric::int

数字保持在整数范围内是您的责任,否则您会遇到下一个异常。


如果没有解决问题,您需要查看函数重载

函数类型解析

架构搜索路径在许多相关情况下都是相关的,但您确实对所有对象进行了架构限定,因此我们可以排除这种情况。

您的查询通常看起来不错。我看了看,只发现了细微的改进:

SELECT NULL::int AS agent_id  -- never omit the AS keyword for column alias
     , a.tract_id_alias
     , b.year
     , s.pgid
FROM  (
   SELECT tract_id_alias
        , array_agg(pgid)              AS pgids
        , array_agg(sample_weight_geo) AS block_weights
   FROM  (  -- use a subquery, cheaper than CTE
      SELECT tract_id_alias
           , pgid
           , sample_weight_geo
      FROM   results_20161109.block_microdata_res_joined
      WHERE  tract_id_alias IN (66772, 66773, 66785, 66802, 66805, 66806, 66813)
      AND    bldg_count_res > 0
      ORDER  BY pgid  -- sort once in a subquery. cheaper.
      ) sub
   GROUP  BY 1
   ) a
LEFT   JOIN results_20161109.initial_agent_count_by_tract_res_11 b USING (tract_id_alias)
LEFT   JOIN LATERAL
   unnest(shared.sample(a.pgids
                      , b.n_agents
                      , b.year  -- why "1 * b.year"?
                      , true
                      , a.block_weights)) s(pgid) ON true
ORDER  BY b.year, a.tract_id_alias, s.pgid;

【讨论】:

  • 感谢您的建议,我试过了,但仍然遇到同样的错误。 results_20161109.initial_agent_count_by_tract_res_11 中的 n_agents 列确实是 integer 类型,所以我不确定还有什么问题。
  • 所以我注意到shared 模式中有几个shared.sample 函数,每个函数都执行相同的操作并使用相同的 R 函数,但将不同的基本类型作为参数,例如:@987654343 @sample(integer[], integer, integer, boolean, numeric[])sample(bigint[], integer, bigint, boolean, numeric[])sample(bigint[], integer, integer, boolean, numeric[])这会影响结果吗?
  • @KevinM:是的,它可以。我在上面添加了一些提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2014-07-17
  • 2020-05-05
  • 1970-01-01
  • 2012-12-21
  • 2020-04-27
相关资源
最近更新 更多