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

Firebird Discussion :

comment ordonner une table sur un champs alphanumerique comme un numérique


Sujet :

Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 954
    Par défaut comment ordonner une table sur un champs alphanumerique comme un numérique
    Bonjour à tous,

    dans un précédent post http://www.developpez.net/forums/d15...ant-numerique/ j'ai exposé le problème de la recuperation des valeurs numérique sur un champs alphanumérique et continuons sur le même registre je voudrais trié les enregistrements trouvé dans un ordre numérique.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 706
    Billets dans le blog
    65
    Par défaut
    Bonjour, pour les tris il s'agit d'un problème de COLLATION par contre cela dépend aussi du CHARSET utilisé

    pistes de lectures http://www.destructor.de/firebird/charsets.htm,http://sqlpro.developpez.com/cours/s...er/collations/

    cependant je ne suis pas sur qu'il existe un COLLATION 'toute faite' du permettant un genre de tri
    0,1,2,3,....,
    10,11, ...,
    20,21 ...
    puis Alphabétique

    depuis FB 2.1 on peut ajouter des COLLATION a nos bases de données la version 2.5 a encore amélioré le processus
    http://www.firebirdsql.org/refdocs/l...collation.html

    un exemple que j'ai trouvé (en portuguais)
    O Firebird 2.5 permite que collates sejam configuráveis, e uma das opções do collate UNICODE permite que números sejam ordenados por ordem numérica. A listagem 4 mostra a criação do collate UNICODE_NUM com o uso da opção NUMERIC-SORT e a ordenação usando este collate.

    Listagem 4. Ordenação usando a opção NUMERIC-SORT do collate UNICODE.
    tentative de traduction
    [QUOTE]Firebird 2.5 permet que les ordres de tri (collation) soit configurées, une option que UNICODE permet est que les numéros soient triés en ordre numérique ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE COLLATION UNICODE_NUM FOR UTF8 FROM UNICODE 'NUMERIC-SORT=1';
     
    CREATE TABLE DOCUMENTOS2 (
      CODIGO VARCHAR(10) CHARACTER SET UTF8 COLLATE UNICODE_NUM
    );
     
    INSERT INTO DOCUMENTOS2 SELECT * FROM DOCUMENTOS;
     
    -- Resultat: A1, A2, A10, A11, A100, B1, B10
    SELECT CODIGO FROM DOCUMENTOS2 ORDER BY CODIGO;
    à te lire pour connaitre ta solution à partir de ces éléments

  3. #3
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Bonjour,

    La création d'un collation me parait le plus intéressant (et universelle si vous avez d'autres colonnes à traiter de la même manière)

    Cependant, il y a d'autres alternatives

    Si vous souhaitez ne trier que les chaines etapro qui ne contiennent que des chiffres vous pouvez procéder autrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select * 
    from produit p
    order by (case when p.etapro similar to '[[:DIGIT:]]{1,}' then cast(p.etapro as integer)
         else null
         end);
    Le problème c'est si votre table est énorme, cette requête va balayer toute votre table et donc risque d'être longue.

    Dans ce cas il faut créer un index "calculé" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE INDEX PRODUIT_IDX1 ON PRODUIT COMPUTED BY (case when etapro similar to '[[:DIGIT:]]{1,}' then cast(etapro as integer)
         else null
         end);
    Si vous ne voulez pas créer d'index calculé, une seconde solution consisterai à ajouter une colonne "ETAPRONUM integer" à votre table produit. Cette colonne serait automatiquement alimentée par des triggers avec la valeur numerique, vous pouvez créer un index 'classique' sur cette colonne.

    Enfin pour conclure troisième alternative, vous pouvez également ajouter une colonne calculée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ETAPRONUM  COMPUTED BY (case when etapro similar to '[[:DIGIT:]]{1,}' then cast(etapro as integer)
         else null
         end)
    On ne peut pas créer directement d'index sur cette colonne il vous faudra créer un index calculé de la même manière.

    la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from produit 
    order by etapronum
    utilisera bien l'index calculé.

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 954
    Par défaut
    Bonjour et merci pour vos réponses,

    les 2 méthodes peuvent être une solution,cependant la solution de @Barbibulle me parait la plus facile et rapide à utilisée. je vai testé tous ça et je vous tiens au courant.

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 954
    Par défaut
    rebonjour,

    je crois que j'ai parlé trop vite pour la réponse de @barbibulle, ça exige que la champs "etapro" contienne que des numériques pour un champs crée pour une saisie alphanumérique. Par contre , la méthode de @sergio nécessite de crée une autre table et je ne sais pas si le tri ce fait sur n'importe quelle valeurs, je m'explique. En effet, la table produit est créer pour une entreprise de vente d'articles d'occasion de tout genre alors la codification est anarchique exple:

    PRO DÉSIGNATION
    ---------------------------------------------------
    CHA001 Chaise roulante
    045545 Perceuse électrique
    RTDSSG Calculette
    578 /dg Moteur électrique
    .....
    ....
    -----------------------------------
    et dés fois il ya des articles sans code et là la codification automatique doit être appliquée. donc comment récupérer la plus grande valeur seulement sur les champs numériques de la table?

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    Citation Envoyé par chekkal Voir le message
    Par contre , la méthode de @sergio nécessite de crée une autre table
    non
    juste un ordre de tri que l'on appliquera sur le champ

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 706
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par chekkal Voir le message
    et dés fois il ya des articles sans code et là la codification automatique doit être appliquée. donc comment récupérer la plus grande valeur seulement sur les champs numériques de la table?
    rein n'empêche un générateur , sauf qu'il va falloir gérer deux choses :
    1 - les codes non numériques
    2 - la conversion de numérique vers varchar

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

Discussions similaires

  1. peut on filtrer une table sur deux champs
    Par lila23 dans le forum Débuter
    Réponses: 3
    Dernier message: 20/04/2009, 18h48
  2. Réponses: 1
    Dernier message: 09/11/2006, 13h08
  3. [D7],[ADO] : ordonner une table avec des champs référencés
    Par iam dans le forum Bases de données
    Réponses: 3
    Dernier message: 07/11/2006, 22h36
  4. [C# 2.0] Comment créer une table sur un serveur SQL 2000 ?
    Par Filippo dans le forum Accès aux données
    Réponses: 1
    Dernier message: 15/09/2006, 14h30
  5. [ADO.NET]Comment réaliser une relation sur plusieurs champs?
    Par kleomas dans le forum Accès aux données
    Réponses: 3
    Dernier message: 13/03/2006, 13h40

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