IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Conversion de varchar en entier


Sujet :

SQL Oracle

  1. #1
    Membre actif
    jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Inscrit en
    Septembre 2010
    Messages
    74
    Détails du profil
    Informations professionnelles :
    Activité : jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2010
    Messages : 74
    Par défaut Conversion de varchar en entier
    bonjour,

    comment convertir des varchar en entier ?

    select replace( substr( DMOF, instr(DMOF,'rato')+8, (instr(DMOF,'FN')-1) - (instr(DMOF,'rato')+7) ),'', null )
    from PPM_P where IDEN='383545';
    affiche 16
    c 'est à dire
    replace( substr( DMOF, instr(DMOF,'rato')+8, (instr(DMOF,'FN')-1) - (instr(DMOF,'rato')+7) ),'', null ) est égal à 16
    mais pourquoi alors çà ne marche pas quand je fais

    select DMOF from PPM_P
    where IDEN='383545' and
    replace( substr( DMOF, instr(DMOF,'rato')+8, (instr(DMOF,'FN')-1) - (instr(DMOF,'rato')+7) ),'', null )=16;
    ou

    select DMOF from PPM_P
    where IDEN='383545' and
    replace( substr( DMOF, instr(DMOF,'rato')+8, (instr(DMOF,'FN')-1) - (instr(DMOF,'rato')+7) ),'', null )='16';
    j'ai toujours ce message

    ORA-00936: missing expression
    sincères mercis
    lastmagik

  2. #2
    Invité
    Invité(e)

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Si tu nous précisais la structure de la colonne dont tu veux extraire cet entier, ce serait sans doute plus facile pour t'aider.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Pas d'idée sur le message d'erreur, la requête est lancée telle quelle en sql+ ou sous sqldev ou toad ?

    Le replace (..., '', NULL) ne sert à rien

    Qu'est ce qu'il y a dans dmof pour cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT dmof, SUBSTR( DMOF, INSTR(DMOF,'rato')+8, (INSTR(DMOF,'FN')-1) - (INSTR(DMOF,'rato')+7) ) AS rpl
    FROM PPM_P 
    WHERE IDEN='383545'

  5. #5
    Membre actif
    jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Inscrit en
    Septembre 2010
    Messages
    74
    Détails du profil
    Informations professionnelles :
    Activité : jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2010
    Messages : 74
    Par défaut suite réponses
    bonjour,

    merci de avoir lu mon méssage.

    al1_24 >
    Name Type
    DMOF VARCHAR2(300)
    McM >
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SQL> select DMOF from PPM_P where IDENT='3545';
     
    DMOF
    --------------------------------------------------------------------------------
    RD
       30/06/2011 f
                    14/05/2009 l
                                 -999999999 rat_idx 16 FN 3 FD
                                                               10/06/2011 las
    t_notif
            30/06/2011 ac 0 sc_num 71795718434700
    SQL> select replace( substr( DMOF, instr(DMOF,'rat_idx')+8, (instr(DMOF,'FN')-1) - (instr(DMOF,'rat_idx')+7) ),'', null ) as sali from PPM_P where IDENT='3545';

    SALI
    --------------------------------------------------------------------------------
    16
    en effet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    replace( substr( DMOF, instr(DMOF,'rat_idx')+8, (instr(DMOF,'FN')-1) - (instr(DMOF,'rat_idx')+7) ),'', null ) as sali
    est censé retourner la valeur de 16 mais je souhaite qu il soit typé en entier.
    C'est pour pouvoir mieux le manipuler et surtout pour faire comparer pour la condition where sali=16

    sincères mercis
    lasmagik

  6. #6
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,

    Le problème vient du fait que la chaîne contient un espace à la fin.
    Pour le voir, il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT '>' || REPLACE( substr( DMOF, instr(DMOF,'rat_idx')+8, (instr(DMOF,'FN')-1) - (instr(DMOF,'rat_idx')+7) ),'', NULL ) || '>' AS sali...
    Le résultat est La bonne syntaxe pour obtenir 16 sans espace à la fin est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REPLACE( substr( DMOF, instr(DMOF,'rat_idx')+8, (instr(DMOF,'FN')-1) - (instr(DMOF,'rat_idx')+8) ),'', NULL ) AS sali

  7. #7
    Membre actif
    jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Inscrit en
    Septembre 2010
    Messages
    74
    Détails du profil
    Informations professionnelles :
    Activité : jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2010
    Messages : 74
    Par défaut re formulation de la question
    bonjour à tous et à tedo01,

    merci tedo01 tu as raison il y a un espace

    mais avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select SLAM from PPM_P where IDENT='3545';
    ce qui m'interresse c'est que avec quelle commande je dois faire pour enlever tous les espaces dans SLAM.

    une fois les espaces enlevés j'ai '4518' mais en tant que chaîne de caractères.

    et ensuite comment '4518' convertir en entier 4518.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    select 
    to_number( REPLACE( SLAM ,'', null ) ) 
    from PPM_P 
    where IDENT='3545';
    mais çà ne marche pas que dois je faire pour enlever les espaces, et ensuite faire la conversion en entier ?

    sincères mercis
    lastmagik

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Et avec trim ?

  9. #9
    Membre actif
    jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Inscrit en
    Septembre 2010
    Messages
    74
    Détails du profil
    Informations professionnelles :
    Activité : jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2010
    Messages : 74
    Par défaut
    bonjour skuatamad,

    j'ai fait la commande suivante et cela ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SQL> select trim ('  12 3  4 5  6 7') from dual;
     
    TRIM('1234567'
    --------------
    12 3  4 5  6 7
    peut-être il faut d'abord convertir la chaîne ' 12 3 4 5 6 7' en type que trim peut traiter ?

    quel type et comment convertir ?

    sincères remerciements
    lastmagik

  10. #10
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select to_number(replace('1 2 3 4', ' ', '')) from dual

  11. #11
    Membre actif
    jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Inscrit en
    Septembre 2010
    Messages
    74
    Détails du profil
    Informations professionnelles :
    Activité : jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2010
    Messages : 74
    Par défaut meme formule mais différente réponse
    bonjour à tou et à pacmann,

    je fais les fonctions REPLACE et TO_NUMBER mais elles ne marchent sur la table PPM. Pourtant elles marchent très bien avec dual.

    dessous, on voit bien que les espaces sont bien enlevées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SQL> select '>' || replace( substr('123456 89  1 23',6,7) ,' ','' ) || '<' as sali from dual;
     
    SALI
    ------
    >6891<
    dessous, on voit que les espaces ne sont pas enlevées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SQL> select '>' || REPLACE( 
    substr( DMOF, instr(DMOF,'rat_idx')+7, (instr(DMOF,'FN')-1) 
             - (instr(DMOF,'rat_idx')+6) ) ,' ', '') || '<' 
    as sali 
    from PPM 
    where IDEN='3545';
     
    SALI
    -----------------
    > 16 <

    pour to_number c'est aussi la même chose

    dessous on voit bien que to_number marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SQL> select to_number( replace( substr('123456 89  1 23',6,7) ,' ','' ) ) as sali from dual;
     
          SALI
    ----------
          6891
    dessous, premierement on va isoler 16
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SQL> select '>' || 
    substr( DMOF, instr(DMOF,'rat_idx')+7+1, (instr(DMOF,'FN')-1-1-1) 
                      - (instr(DMOF,'rat_idx')+6) )  || '<' as sali 
    from PPM 
    where IDENT='3545';
     
    SALI
    --------------------------------------------------------------------------------
    >16<
    deuxiement nous allons enlever > et <
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SQL> select 
    substr( DMOF, 
    instr(DMOF,'rat_idx')+7+1, (instr(DMOF,'FN')-1-1-1) -   (instrDMOF,'rat_idx')+6) )   
    as sali 
    from PPM 
    where IDENT='3545';
     
    SALI
    --------------------------------------------------------------------------------
    16
    maintenant je vais faire to_number et ça ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    SQL> select 
    to_number( substr( DMOF, instr(DMOF,'rat_idx')+7+1, 
                   (instr(DMOF,'FN')-1-1-1) - (instr(DMOF,'rat_idx')+6) ) )
    as sali 
    from PPM 
    where IDENT='3545';
     
                      *
    ERROR at line 1:
    ORA-01722: invalid number
    rappelons que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Name                             Type
    DMOF                             VARCHAR2(300)
    ma conclusion est la replace et to_number marchent bien mais pas pour le champ DMOF de ma la table PPM.

    merci beaucoup
    lastmagik

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    La colonne IDENT est de quel type ?

    N'oubliez pas que Oracle agit comme il veut.
    Il peut très bien essayer de faire le to_number AVANT de faire le filtre.

    Ça signifie que sur toutes les lignes de votre table, cette partie de la chaîne doit être numérique.

    Comme ce n'est probablement pas le cas, il vaut mieux travailler en chaîne de caractère.

    Si j'ai bien suivi, essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select DMOF
      from PPM_P
     where IDEN = '383545'
       and substr(DMOF, instr(DMOF,'rato')+8, (instr(DMOF,'FN')-1) - (instr(DMOF,'rato')+7) ) like '%16%';
    Pour votre cas particulier, vous être probablement en face d'un espace insécable (alt+0160) ou un autre caractère qui ressemble à un espace mais qui n'est pas un espace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    With SR as
    (
    select chr(49824) || 'CAS1' || chr(49824) as col from dual union all
    select chr(   32) || 'CAS2' || chr(   32)        from dual
    )
    select col
         , '>' ||         col           || '<' as rs1
         , '>' || replace(col, ' ', '') || '<' as rs2
      from SR;
     
    COL    RS1      RS2                       
    ------ -------- --------------------------
     CAS1  > CAS1 < > CAS1 <                  
     CAS2  > CAS2 < >CAS2<

  13. #13
    Membre actif
    jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Inscrit en
    Septembre 2010
    Messages
    74
    Détails du profil
    Informations professionnelles :
    Activité : jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2010
    Messages : 74
    Par défaut liste des caractères insécables
    bonjour à tous et à waldar,

    merci waldar pour ta réponse.
    oui j'ai essayé les codes que tu m'as proposé ils m'ont beaucoup aidé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    chr(49824)
    chr(   32)
    mais est ce que tu peux me donner la liste des espaces insécables :

    j'ai fait l'éxperience il suffit de faire la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    replace(DMOFIELD,chr(49824),'')
    et l'espace insecable est remplacé.

    mais est ce que tu pourras me donner la liste des code des espaces et des espaces insécables car je n'ai pas encore réussi quelle est le code de l'espace à remplacer.
    et je vais essayer une à une les code avec la fonction replace

    sincères mercis
    lastmagik

  14. #14
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Avec tous les encodages qui existent, je ne pense pas qu'une telle liste existe.
    Utilisez la solution avec le like pour votre problème, le replace n'est pas la bonne solution.

  15. #15
    Membre actif
    jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Inscrit en
    Septembre 2010
    Messages
    74
    Détails du profil
    Informations professionnelles :
    Activité : jARdinaJ - ArTista - PeinturA - PoéZie - mUzICa
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2010
    Messages : 74
    Par défaut solution trouvée
    bonjour à tous et à waldar,

    grâce à vos aides précieuses j'ai réussi à trouver la solution.
    il suffit tout simplement de mettre un à un dans la fonction ascii les caractères un par un, pour savoir leurs code ascii.

    merci beaucoup à tous et à vos interventions précieuses et utiles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select ascii('A') from dual;
    sincères remerciements
    lastmagik

  16. #16
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,
    En complément, la fonction DUMP permet de trouver le code ascii de plusieurs caractères en une fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DUMP('abcdef') FROM DUAL
    donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DUMP('ABCDEF')                    
    ----------------------------------
    Typ=96 Len=6: 97,98,99,100,101,102
    1 row selected.

Discussions similaires

  1. Conversion chaine de caractère => entier (ordre des caractères primordial car ADN)
    Par ctobini dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 24/09/2007, 11h20
  2. Problème Conversion REAL --> VARCHAR
    Par YOYOVbSQL dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2006, 18h03
  3. Conversion de varchar en float possible ?
    Par toyyo dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/12/2005, 17h05
  4. Conversion de chaîne en entier
    Par SkYsO dans le forum Langage
    Réponses: 4
    Dernier message: 30/08/2005, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo