Vous n'êtes pas identifié(e).
Pages : 1
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
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;
Julien.
https://rjuju.github.io/
Hors ligne
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
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
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
Bonjour
Mais il y pas de carcter en chiffre,, justement
SUBSTR(col1,4,3) ramene uniquement les chiffres
Hors ligne
Si j'ai bien compris, il ramène aussi des espaces.
Guillaume.
Hors ligne
Oui, dans certains cas, oui.
Donc, l'idée est de convertir en INT les valeurs en chiffres
Hors ligne
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
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.
Julien.
https://rjuju.github.io/
Hors ligne
Pages : 1