2016-11-09 1 views
0

Le message d'erreur complet est:PostgreSQL ERREUR: syntaxe d'entrée non valide pour entier: "1E + 06"

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

La requête J'utilise est:

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; 

Et la fonction I shared.sample J'utilise est:

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

Je suis assez nouveau pour ce genre de choses, donc toute aide serait appréciée.

+0

Vous devez [modifier] votre question avec des informations pertinentes: ce que vous avez dit ci-dessous, votre version de Postgres, le chemin de recherche actuel de schéma (SHOW search_path') et de la table définitions montrant les types de données pertinents. –

Répondre

2

Pas un problème de la fonction. Comme les messages d'erreur indique: La chaîne '1e+06' ne peut pas être convertie en integer. De toute évidence, les colonnes n_agents dans votre table results_20161109.initial_agent_count_by_tract_res_11 ne sont pas une colonne integer. Vous tapez probablement text ou varchar? (Cette information aiderait dans votre question.)

Dans tous les cas, la distribution d'affectation ne fonctionne pas pour le type cible integer. Mais il le fait pour numeric:

ne fonctionne pas:

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

Travaux:

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

Si mes hypothèses tiennent, vous pouvez l'utiliser comme tremplin.
Remplacez b.n_agents dans votre requête par b.n_agents::numeric::int.

Il est de votre responsabilité que les nombres restent dans la plage entière, ou vous obtenez la prochaine exception.


Si cela n'a pas clouer, vous devez regarder en fonction surcharge:

et le type fonction résolution:

Le chemin de recherche de schéma est pertinent dans le cas de mai liés, mais vous ne schéma qualifier tous les objets, afin que nous puissions exclure cela.

Votre requête semble généralement bonne.J'ai eu un coup d'oeil et seulement trouvé des améliorations mineures:

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

Merci pour votre suggestion, je l'ai essayé et je reçois toujours la même erreur. La colonne 'n_agents' dans' results_20161109.initial_agent_count_by_tract_res_11' est en effet de type 'integer', donc je ne suis pas sûr de ce que pourrait être le problème. –

+0

J'ai donc remarqué qu'il y a plusieurs fonctions 'shared.sample' dans le schéma' shared', chacune faisant la même chose et utilisant la même fonction R, mais prenant différents types de base comme arguments, par exemple: 'sample (integer [ ], entier, bigint, booléen, numérique []) ' ' échantillon (entier [], entier, entier, booléen, numérique []) ' ' exemple (bigint [], entier, bigint, booléen, numérique []) ' ' sample (bigint [], entier, entier, booléen, numérique []) ' Ceci est-il possible? –

+0

@KevinM: Oui, c'est possible. J'ai ajouté quelques indices ci-dessus. –