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

Requêtes PostgreSQL Discussion :

Formatage d'un entier avec "bourage" de 0 initial (à partir d'une valeur de la base) [8.4]


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut Formatage d'un entier avec "bourage" de 0 initial (à partir d'une valeur de la base)
    Bonjour à tous,

    Petite question toute bête:
    je souhaite formater un entier pour qu'il fasse au minimum N caractères (avec bourrage de '0' initial).
    Pour cela, facile car TO_CHAR fait ça très bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT to_char(monchamp, '000000') FROM matable;
    Maintenant, je souhaite utiliser une autre valeur de ma base (un entier) qui indique le nombre minimal de caractères qu'il faut, et là je coince.

    Par exemple, j'ai un champ nombre_min avec la valeur '6' pour indiquer que le format de ma_valeur doit avoir au moins 6 caractères, avec bourrage de '0' initial.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT to_char(ma_valeur, ????? nombre_min ????? ) FROM matable;
    merci d'avance pour votre aide!

    EDIT:
    J'ai trouvé ça comme solution, mais je dit qu'il doit y avoir plus propre (et plus efficace!!!):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT to_char(ma_valeur, substring('000000000000000000000000' from 1 for nombre_min) ) FROM matable;
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  2. #2
    Membre habitué Avatar de GAEREL
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 160
    Points : 147
    Points
    147
    Par défaut
    Bonjour.

    LPAD non ?

    SELECT lpad('123', 6 , '0') -> '000123'

    SELECT lpad(ma_valeur::text, nombre_min , '0')

  3. #3
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Merci pour cette réponse, je découvre une fonction car ne connaissait pas LPAD!
    Par contre il tronque si la chaine est trop longue (alors que moi je veux garder la chaine si la taille est déjà supérieure ou égale):
    123 => 000123
    NULL => 000000
    1234 => 001234
    1234567 => 1234567

    Je pourrai ajouter un test, mais ça va perdre beaucoup de son intérêt et de son efficacité.

    Si quelqu'un à d'autres pistes je suis preneur, dans le cas contraire je vais me contenter de la solution que j'ai trouvé initialement.

    Merci
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  4. #4
    Membre habitué Avatar de GAEREL
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 160
    Points : 147
    Points
    147
    Par défaut
    Avec l'ajout d'un GREATEST :

    SELECT LPAD(ma_valeur::text, GREATEST(nombre_min,LENGTH(ma_valeur::text)) , '0')

    Il prendra la plus grande des deux valeurs : soit la longueur de votre chaine, soit la taille mini que vous souhaitez

    Plus de valeur tronquée...

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 142
    Points : 38 924
    Points
    38 924
    Billets dans le blog
    9
    Par défaut
    bonjour,

    Pourquoi ne pas directement pader avec des zéros à concurrence de la longueur maximale possible plutôt que sur 6 caractères ?

  6. #6
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Merci, les deux solutions fonctionnent bien.

    En terme d'efficacité sur des gros volumes de données (l'exemple est simple, mais mon cas concret beaucoup plus complexe), quel est le plus efficace entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* LENGTH + GREATEST + ::TEXT + LPAD */
    SELECT LPAD(ma_valeur::text, GREATEST(nombre_min,LENGTH(ma_valeur::text)) , '0') FROM matable;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*SUBSTRING + TO_CHAR */
    SELECT to_char(ma_valeur, substring('000000000000000000000000' from 1 for nombre_min) ) FROM matable;
    Vu que les deux fonctionnent, je vais me diriger vers la solution la plus efficace et "rapide" à exécuter!
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  7. #7
    Membre habitué Avatar de GAEREL
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 160
    Points : 147
    Points
    147
    Par défaut
    Résultat des courses ?

    Quelle est la méthode la plus efficace sur un gros volume ?

  8. #8
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Au final je n'ai pas testé sur des gros volume de données, mais j'ai opté pour LPAD, car la solution avec TO_CHAR montre ses limites très rapidement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT to_char(12345, substring('0000000000' from 1 for 3) );
    Et l'utilisation de LPAD dans mon cas précis reste satisfaisante et assez efficace.
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

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

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