J'essaie de charger certaines données d'une scène à un environnement relationnel et quelque chose se passe que je ne peux pas comprendre.
J'essaie d'exécuter la requête suivante:
SELECT
CAST(SPLIT_PART(some_field,'_',2) AS BIGINT) cmt_par
FROM
public.some_table;
Some_field est une colonne qui contient des données avec deux nombres joints par un trait de soulignement comme ceci:
some_field -> 38972691802309_48937927428392
Et j'essaie d'obtenir la deuxième partie.
Cela dit, voici l'erreur que je reçois:
[Amazon](500310) Invalid operation: Invalid digit, Value '1', Pos 0,
Type: Long
Details:
-----------------------------------------------
error: Invalid digit, Value '1', Pos 0, Type: Long
code: 1207
context:
query: 1097254
location: :0
process: query0_99 [pid=0]
-----------------------------------------------;
Execution time: 2.61s
Statement 1 of 1 finished
1 statement failed.
Il dit littéralement que certains chiffres ne sont pas des chiffres valides. J'ai déjà essayé d'obtenir les données exactes qui génèrent l'erreur et il semble que ce soit un champ normal, comme je m'y attendais. Cela se produit même si je jette des champs NULL.
Je pensais que ce serait une erreur d’encodage, mais je n’ai trouvé aucune référence pour résoudre ce problème… .. Quelqu'un en a-t-il une idée?
Merci à tous.
J'ai juste rencontré ce problème et fait quelques recherches. On dirait que l'erreur Value '1'
est la partie trompeuse, et le problème est que ces champs ne sont tout simplement pas valides comme numériques.
Dans mon cas, ils étaient des chaînes vides. J'ai trouvé la solution à mon problème dans cet article de blog , qui consiste essentiellement à rechercher les champs non numériques et à les remplir avec null avant le casting.
select cast(colname as integer) from
(select
case when colname ~ '^[0–9]+$' then colname
else null
end as colname
from tablename);
En bout de ligne: cette erreur Redshift est complètement déroutante et doit vraiment être corrigée.
Hmmm. Je commencerais par enquêter sur le problème. Y a-t-il des caractères autres que des chiffres?
SELECT some_field
FROM public.some_table
WHERE SPLIT_PART(some_field, '_', 2) ~ '[^0-9]';
La valeur est-elle trop longue pour une bigint
?
SELECT some_field
FROM public.some_table
WHERE LEN(SPLIT_PART(some_field, '_', 2)) > 27
Si vous avez besoin de plus de 27 chiffres de précision, considérez decimal
plutôt que bigint
.