web-dev-qa-db-fra.com

Chiffres invalides sur Redshift

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.

6
Maurício Borges

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. 

2
szeitlin

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.

1
Gordon Linoff