2016-11-09 221 views
0

完整的錯誤信息是:PostgreSQL的錯誤:整數無效的輸入語法: 「1E + 06」

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"; 

我很新的東西,所以任何幫助,將不勝感激。

+0

你應該[編輯]相關信息,你的問題:你下面的評論是什麼,你的Postgres的版本,當前模式搜索路徑('SHOW search_path')和表定義顯示相關的數據類型。 –

回答

2

不是功能的問題。像錯誤消息所示:字符串'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_agentsb.n_agents::numeric::int

這是你的責任,數字保持整數範圍,否則你會得到下一個異常。


如果不打釘,你需要尋找到函數重載

而且函數的類型

的模式搜索路徑是在5月份相關案件有關,但你沒有模式,所有符合條件的對象,所以我們可以排除這一可能性。

您的查詢通常看起來不錯。我一看,才發現小的改進:

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; 
+0

感謝您的建議,我試了一下,仍然得到相同的錯誤。 'results_20161109.initial_agent_count_by_tract_res_11'中的'n_agents'列確實是'integer'類型,所以我不確定還有什麼問題可以解決。 –

+0

所以我注意到'shared'模式中有幾個'shared.sample'函數,每個函數都做同樣的事情並使用相同的R函數,但是採用不同的基類型作爲參數,例如: 'sample(integer [ (整數,大整數,布爾值,數值[]),整數,大整數,布爾值,數值[])[ '樣本(整數[],整數,整數,布爾值,數值[])' ' ' '樣本(bigint [],整數,整數,布爾值,數值[])' 這可能會影響結果嗎? –

+0

@KevinM:是的,它可以。我在上面添加了一些提示。 –

相關問題