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

Langage SQL Discussion :

découper un champ (chaine)+(nombre)


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Points : 95
    Points
    95
    Par défaut découper un champ (chaine)+(nombre)
    bonjour,

    existe-t-il une synthaxe pour réaliser la chose suivante?

    dans un champ d'une table, mes données sont renseignées de la façon suivante : PREFIXE + NOMBRE

    a chaque nouvel ajout, je dois avoir la dernière valeur saisie (dans mon cas le numéro maximum)

    je voudrais récupérer juste le numéro max contenu dans ce champ .

    comme j'ai peur de ne pas être clair, un exmple
    mon champ
    -------------
    TRE250
    TED125
    OPLMN850
    T26
    ARCH4000
    dans ce cas, je devrais avoir '4000'.

    de plus, la taille de mon préfixe est variable suivant l'enregsitrement.

    merci d'avance pour vos réponse

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Je sais pas , ça dépend de ton SGBD
    en SQL Server je ferais comme ça
    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT     CASE WHEN ISnumeric(RIGHT(col1, 10)) = 0 THEN CASE WHEN ISnumeric(RIGHT(col1, 9)) = 0 THEN CASE WHEN ISnumeric(RIGHT(col1, 8)) 
                          = 0 THEN CASE WHEN ISnumeric(RIGHT(col1, 7)) = 0 THEN CASE WHEN ISnumeric(RIGHT(col1, 6)) = 0 THEN CASE WHEN ISnumeric(RIGHT(col1, 5)) 
                          = 0 THEN CASE WHEN ISnumeric(RIGHT(col1, 4)) = 0 THEN CASE WHEN ISnumeric(RIGHT(col1, 3)) = 0 THEN CASE WHEN ISnumeric(RIGHT(col1, 2)) 
                          = 0 THEN CASE WHEN ISnumeric(RIGHT(col1, 1)) = 0 THEN 'NOK' ELSE RIGHT(col1, 1) END ELSE RIGHT(col1, 2) END ELSE RIGHT(col1, 3) 
                          END ELSE RIGHT(col1, 4) END ELSE RIGHT(col1, 5) END ELSE RIGHT(col1, 6) END ELSE RIGHT(col1, 7) END ELSE RIGHT(col1, 8) 
                          END ELSE RIGHT(col1, 9) END ELSE RIGHT(col1, 10) END AS Expr1
    FROM         matable
    Note : le champ col1 fait 10 de longueur,
    l'idée étant que pour par exemple albert2156
    je teste si albert2156 est numeric
    si non lbert2156 ...
    si non bert2156 ...
    si non ert2156 ...
    si non rt2156 ...
    si non t2156 ...
    si non 2156 ...
    et je renvoie 2156

    dans l'exemple Isnogood
    je renverrais NOK
    Ya sans doute plus simple ... mais mon code fonctionne

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 36
    Points : 37
    Points
    37
    Par défaut
    g également une petite solution.mais ça fait un peu brouillon...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select Case
    when right(ton_champ,,charindex('1',ton_champ,0))<> 0 then right(ton_champ,charindex('1',ton_champ,0))
    when right(ton_champ,charindex('2',ton_champ,0))<> 0 then right(ton_champ,charindex('2',ton_champ,0))
    when right(ton_champ,charindex('3',ton_champ,0))<> 0 then right(ton_champ,charindex('3',ton_champ,0))
    when right(ton_champ,charindex('4',ton_champ,,0))<> 0 then right(ton_champ,charindex('4',ton_champ,0))
    ...jusqu'a 9 
     
    end as result
    from ta table
    [/code]

  4. #4
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Points : 95
    Points
    95
    Par défaut
    je suis sous postgres et ma valeur est dans dans un champ de type text donc pour parcourir tous les caractères
    si y a pas de solution d'école avec SQL, vous le dîtes, je ferais le découpage dns mon script php (ce sera plus long mais bon!!)

    merci déjà de vos réponses, je vois où vous voulez en venir, c déjà ça

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 077
    Points
    8 077
    Par défaut
    Bonjour

    Sous Oracle, la fonction TRANSLATE fait ça très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TRANSLATE('ARCH4000', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789') FROM DUAL;
    --> 4000

    J'ignore si c'est transposable sous PostgreSQL.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Ton modèle est horriblement incorrect, les solution pour faire ce que tu demande seront toutes abracadabrantes et donnerons des temps de réponse dégueulasse.

    Le meilleur moyen est de découper ta colonne en 2.

    A l'affichage rien n'empêche de reconcaténer ces colonnes, y compris même dans le SELECT.

    A +

  7. #7
    Membre actif
    Avatar de MashiMaro
    Profil pro
    Inscrit en
    Février 2003
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 180
    Points : 213
    Points
    213
    Par défaut
    Citation Envoyé par SQLpro
    Ton modèle est horriblement incorrect, les solution pour faire ce que tu demande seront toutes abracadabrantes et donnerons des temps de réponse dégueulasse.
    Ben pareil mais avec des termes politiquement plus corrects.

    En fait, on constate très souvent que les soucis d'optimisation sont liés à des analyses mal faites et un modèle de données bancal.

  8. #8
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Points : 95
    Points
    95
    Par défaut
    ne vous énervez pas les amis, j'ai une bonne et une mauvaise nouvelle

    - la bonne:
    en faisant ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select LTRIM(mat_inv_num,'AZERTYUIOPQSDFGHJKLMWXCVBN') from matable
    ça marche impec, il m'enlève tout les caractères
    PS: j'ai essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LTRIM(mat_inv_num,'A..Z')
    et il aime pas (je fais qq chose de mal?)

    - la mauvaise:
    fier de mon succès, je voulais reprendre dans la foulée le Maximum de ce chiffre en faisant ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select MAX (LTRIM(mat_inv_num,'AZERTYUIOPQSDFGHJKLMWXCVBN')) from matable
    mais avec les données là
    XX26
    TESTINV6
    BAC4021
    A4890
    il me ressort
    6


    je dois pas être loin pourtant ?

    merci d'avance

  9. #9
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par SQLpro
    Ton modèle est horriblement incorrect, les solution pour faire ce que tu demande seront toutes abracadabrantes et donnerons des temps de réponse dégueulasse.

    Le meilleur moyen est de découper ta colonne en 2.

    A l'affichage rien n'empêche de reconcaténer ces colonnes, y compris même dans le SELECT.

    A +
    avant de dire que mon modèle est incorrect (ce que je ne demandais pas d'ailleurs !) , est-ce que ça t'ai venu à l'idée qu'il était correct et correspondait à un besoin particulier?
    non

    je sais très bien que c pas conseillé mais dans mon cas, ct la seule solution donc avant de critiquer, suffit de demander pourquoi on fait comme ça

  10. #10
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Citation Envoyé par r-zo
    ne vous énervez pas les amis, j'ai une bonne et une mauvaise nouvelle

    - la bonne:
    en faisant ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select LTRIM(mat_inv_num,'AZERTYUIOPQSDFGHJKLMWXCVBN') from matable
    ça marche impec, il m'enlève tout les caractères
    PS: j'ai essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LTRIM(mat_inv_num,'A..Z')
    et il aime pas (je fais qq chose de mal?)

    - la mauvaise:
    fier de mon succès, je voulais reprendre dans la foulée le Maximum de ce chiffre en faisant ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select MAX (LTRIM(mat_inv_num,'AZERTYUIOPQSDFGHJKLMWXCVBN')) from matable
    mais avec les données là
    XX26
    TESTINV6
    BAC4021
    A4890
    il me ressort
    6


    je dois pas être loin pourtant ?

    merci d'avance
    Normal
    c le max de tes chaines de caractères '26','4890','4021','6'
    Faut utiliser aussi une fonction qui va caster tes chaines
    en numérique avant de tenter d'en soutirer le max ...

  11. #11
    Membre régulier
    Inscrit en
    Avril 2003
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2003
    Messages : 121
    Points : 95
    Points
    95
    Par défaut
    merci à tous

    voici la requête finale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select 
    max(
    cast(
    (LTRIM(mat_inv_num,'AZERTYUIOPQSDFGHJKLMWXCVBN') )
     as integer)) as monnum
    from matable

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Découper un Champs
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 12/06/2006, 13h23
  2. Découper un champ à l'insertion
    Par gk14fire dans le forum Oracle
    Réponses: 2
    Dernier message: 10/05/2006, 15h45
  3. Découper un champ à l'insertion
    Par gk14fire dans le forum Oracle
    Réponses: 1
    Dernier message: 05/05/2006, 13h38
  4. Découper un champ texte quand on rencontre une virgule
    Par jeanfrancois dans le forum Langage
    Réponses: 7
    Dernier message: 28/04/2006, 12h10
  5. [VB.NET] limiter les valeurs d'un champs aux nombres
    Par fabrozor dans le forum Windows Forms
    Réponses: 25
    Dernier message: 28/04/2006, 12h06

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