Vous n'êtes pas identifié(e).

#1 23/05/2018 18:47:48

carls
Membre

Convertir et substring text to integer

Bonjour a tous,

J'ai un "petit" gros probleme de conversion avec pgSQL


J'ai une table test:
create table test(texto text)

On insérer 3 lignes

insert into test values ('123')
insert into test values ('    565') (ici 4 espaces en blanc suivi de 565)
insert into test values ('456')

Et voici un example du conten de ma table


J'ai besoin de soustraire 2 charactéres dans une chaîne text et convertir en int à partir de la 2éme position

J'ai essayé
select substr(CAST(texto AS INTEGER),2,2) from test >> et j'ai toujours un message :"ERROR 42883: function integer,integer,integer doesn't exist"

J'ai essayé une autre approche en utilisant
select nullif(substr(texto,2,3),'')::integer from test >> et je reçois le message ERROR 22P02 invalid synatx near ""

En faite c'est la ligne avec les espaces en blanc  que générè ce comportement, parce que ma chaine de conversion commence à 2 avec 2 de longeur, or dasn cette intervale on retrouve une valeur nul

Pouvez vous m'aider ?

Merci d'avance

Hors ligne

#2 23/05/2018 19:25:17

rjuju
Administrateur

Re : Convertir et substring text to integer

Dans la première requête, vous avez inversé le substr() avec le cast.  Si vous voulez ignorer les espaces non significatigs à gauche, vous pouvez utiliser trim().  Par exemple:

select cast(substr(ltrim(texto),2,2) as integer) from test;

Hors ligne

#3 24/05/2018 09:57:52

carls
Membre

Re : Convertir et substring text to integer

Salut Julien

Je suis d'accord avec toi, au sujet de l'inversion de substr() avec le CAST. Mais c'étais la syntaxe que j'ai trouvé dans le web pour la plupart de examples.

J'ai essayé ton code et ça marche bien, pour cet exampleµ.
Cependant, j'ai une ligne vide, example, si on insert un nouveau registre
insert into test values ('   ')

La ca ne marche plus.
Une idée c'est la bienvenue.


J'ai aussi essayé avec case

CASE
   WHEN substr(text,2,3) is null the null
   ELSE cast( substr(text,2,3) as integer)
END as COL2

Ce qui me semble trés logique, parce que si j'enleve le CAST dérriere le substr ça marche trés bien.

J'ai aussi essayé avec replace et trim, genre
replace(substr(tex,2,3),'',null) ... comble de l'ironie ... remplace toutes les valeurs du champs par null
avec trim
trim(substr(tex,2,3),'',null') ... même résultat .... remplace toutes les valeurs par nulll

Je suis à court d'idées ....
Cdt


Rien y fait.

Dernière modification par carls (24/05/2018 13:34:05)

Hors ligne

#4 24/05/2018 14:54:27

carls
Membre

Re : Convertir et substring text to integer

Voici un testcase "propre"

create table test2 (text text);
--
insert into test2 values ('000        ');     
insert into test2 values ('050001     ');
insert into test2 values ('022000    A');
--
select text from test2 
--
Objectif:
A partir d'ici j'essaye de convertir le subchaîne de caractéres --> substr(text,4,3) en integer sans sucées.
J'au aussi essayé avec nullif, ::integer, tout ce qu'il y a dans le marché à l'heure actuel,
En résumé, j'ai aussi les suggestion du lien
https://stackoverflow.com/questions/105 … r-postgres
--
Test effectués:
L'idée de utiliser case c'étais plutôt avec cet objectif

       case
             when (substring(text,4,3)) = ' ' then null
             else cast(substring(text,4,3)) as integer
        end  as case1
--
Mais postgress ne veut pas "caster" tout simplement ....
Vous trouverez ci-dessous aussi la requete avec plusieurs functions utilisées
--
select
        cast(replace(substr(text,4,3),'',null) as integer) colA,
         replace(trim(substr(text,4,3)),'',null) colB,
         coalesce(substr(text,4,3),'0'),
         --cast(nullif(substring(text,4,3),'')as integer) NULLIFF,
         case
             when (substring(text,4,3)) = null then null
             else (substring(text,4,3))
        end  as case1
from test2
--
Si vous avez des idées, merci d'avance

Dernière modification par carls (24/05/2018 15:24:18)

Hors ligne

#5 25/05/2018 11:32:20

gleu
Administrateur

Re : Convertir et substring text to integer

Une information intéressante serait de savoir en quoi vous voudriez que PostgreSQL transforme un caractère qui n'est pas un chiffre.


Guillaume.

Hors ligne

#6 25/05/2018 14:59:40

carls
Membre

Re : Convertir et substring text to integer

Bonjour
Mais il y pas de carcter en chiffre,, justement
SUBSTR(col1,4,3) ramene uniquement les chiffres

Hors ligne

#7 25/05/2018 15:02:38

gleu
Administrateur

Re : Convertir et substring text to integer

Si j'ai bien compris, il ramène aussi des espaces.


Guillaume.

Hors ligne

#8 25/05/2018 18:15:53

carls
Membre

Re : Convertir et substring text to integer

Oui, dans certains cas, oui.
Donc, l'idée est de convertir en INT les valeurs en chiffres

Hors ligne

#9 25/05/2018 18:17:06

gleu
Administrateur

Re : Convertir et substring text to integer

Et du coup, je reviens à ma première question : en quoi doivent être convertis les espaces ? (et autres caractères qui pourraient s'y trouver mais qui ne seraient pas des chiffres, vu qu'a priori au niveau de la base, rien n'empêche leur saisie)


Guillaume.

Hors ligne

#10 25/05/2018 20:42:58

rjuju
Administrateur

Re : Convertir et substring text to integer

Je serais plutôt d'avis de commencer par vous assurer que vous avez des données saines.  Si vous ne pouvez pas mettre de contrainte sur la table pour empêcher de saisir tout et n'importe quoi, définissez au moins des règles pour savoir quels enregistrements sont valides.

Hors ligne

Pied de page des forums