2016-11-09 3 views
0

Выводится сообщения полной ошибки:PostgreSQL ОШИБКА: неверный входной синтаксис для целого числа: "ой + 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 функции I Используется:

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.

Очевидно, что колонки n_agents в вашем столе results_20161109.initial_agent_count_by_tract_res_11 не являются колонкой integer. Возможно, введите text или varchar? (Эта информация поможет в вашем вопросе.)

В любом случае приведение заданий не подходит для целевого типа 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; 
+0

Спасибо за ваше предложение, я попробовал его и до сих пор получаю ту же ошибку. Столбец 'n_agents' в' results_20161109.initial_agent_count_by_tract_res_11' действительно имеет тип 'integer', поэтому я не уверен, что еще может быть проблемой. –

+0

Итак, я заметил, что в схеме «shared» есть несколько функций «shared.sample», каждый из которых выполняет одну и ту же функцию и использует одну и ту же функцию R, но использует разные базовые типы в качестве аргументов, например: 'sample (integer [ ], integer, bigint, boolean, numeric []) ' ' sample (integer [], integer, integer, boolean, numeric []) ' ' sample (bigint [], integer, bigint, boolean, numeric []) ' ' sample (bigint [], integer, integer, boolean, numeric []) ' Может ли это повлиять на результаты? –

+0

@KevinM: Да, это возможно. Я добавил несколько намеков. –