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

Bases de données Delphi Discussion :

firebird: utilisation de ORDER BY pour un champ VARCHAR


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut firebird: utilisation de ORDER BY pour un champ VARCHAR
    salut

    j'ai un champ (Code_Client) de type VARCHAR(17) c'est un clé primaire de la table clients

    les valeurs existe dans le champ Code_Client est:
    prive0001_2019_1
    prive0001_2019_2
    prive0001_2019_3
    prive0001_2019_10


    Lors de l'utilisation de la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT Code_Client FROM clients
    ORDER BY Code_Client
    résultat de la requête est :
    prive0001_2019_1
    prive0001_2019_10
    prive0001_2019_2
    prive0001_2019_3

    l'enregistrement (prive0001_2019_10) Pourquoi apparaît-il dans le second ordre et non dans le dernier ordre?
    Comment Triez-le par des deux derniers chiffres

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 680
    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 680
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    l'enregistrement (prive0001_2019_10) Pourquoi apparaît-il dans le second ordre et non dans le dernier ordre?
    c'est tout à fait correct puisqu'il s'agit de l'ordre alphabétique
    j'ai un champ (Code_Client) de type VARCHAR(17) c'est un clé primaire de la table clients
    ce n'est pas une très bonne politique, il eut mieux valu avoir une clé primaire numérique (un GENERATOR ou une SEQUENCE) et mettre le code_client en Index unique.
    Comment Triez-le par des deux derniers chiffres
    la vraie bonne solution passe par la création d'une COLLATION (il fallait chercher ici car c'est un sujet purement Firebird) et de le faire à la création de la base !
    NON TESTE car dépendant de votre BDD
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE COLLATION UNICODE_NUM FOR UTF8 FROM UNICODE 'NUMERIC-SORT=1';
    Et la modification de la colonne Code_Client
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE CLIENTS ALTER CODE_CLIENT VARCHAR(17) CHARACTER SET UTF8 COLLATE UNICODE_NUM

    une autre solution consiste à extraire les différents éléments à base de SUBSTRING, RIGHT, LEFT et POSITION et de faire un CAST sur les parties numériques
    soit de manière ponctuelle dans le SQL soit de créer des colonnes calculées pour la table

    exemple, exécutez ceci
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT LEFT('prive0001_2019_1',POSITION('_','prive0001_2019_1')),
           CAST(REPLACE(RIGHT('prive0001_2019_1',char_length('prive0001_2019_1')-POSITION('_','prive0001_2019_1')),'_','.') AS NUMERIC(10,3))
    FROM RDB$DATABASE
    vous obtiendrez
    prive0001_ 2019.100

    Donc avec un SQL comme
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  LEFT(Code_client,POSITION('_',code_client)) PREFIXE,
                CAST(REPLACE(RIGHT(code_client,char_length(code_client)-POSITION('_','code_client')),'_','.') AS NUMERIC(10,3)) NUMERO,
                *
    FROM CLIENTS
    ORDER BY PREFIXE,NUMERO
    Vous aurez l'ordre voulu (à condition que le code soit toujours construit selon le schéma indiqué).
    OUI, c'est vraiment moche ! Cela vaut le coup de se pencher sur les COLLATIONs

    NOTE : Prenez l'habitude de poser les questions purement Firebird comme celle-ci dans le bon forum c'est-à-dire dans https://www.developpez.net/forums/f1...nnees/firebird et même dans ce cas https://www.developpez.net/forums/f1...s/firebird/SQL

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    autre solution, modifier les valeurs comme ceci

    prive0001_2019_01
    prive0001_2019_02
    prive0001_2019_03
    prive0001_2019_10
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    merci

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 680
    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 680
    Billets dans le blog
    65
    Par défaut
    Si vous êtes Administrateur de base de données comme annoncé dans votre profil, j'ose espérer que vous avez opté pour la solution à base de COLLATION

    voici un exemple
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE COLLATION UNICODE_NUM FOR UTF8 FROM UNICODE 'NUMERIC-SORT=1';
    COMMIT;
    CREATE TABLE TEST
    (
      CODE Varchar(17) CHARACTER SET UTF8 COLLATE UNICODE_NUM
    );
    COMMIT;
    INSERT INTO TEST (CODE) VALUES ('prive0001_2019_01');
    INSERT INTO TEST (CODE) VALUES ('prive0001_2019_02');
    INSERT INTO TEST (CODE) VALUES ('prive0001_2019_03');
    INSERT INTO TEST (CODE) VALUES ('prive0001_2019_10');
    INSERT INTO TEST (CODE) VALUES ('prive0001_2019_1');
    INSERT INTO TEST (CODE) VALUES ('prive0001_2019_21');
    INSERT INTO TEST (CODE) VALUES ('prive0001_2019_4');
    INSERT INTO TEST (CODE) VALUES ('prive0001_2019_10');
    COMMIT;

    un SELECT CODE FROM TEST ORDER BY CODE donnera
    prive0001_2019_01
    prive0001_2019_1
    prive0001_2019_02
    prive0001_2019_03
    prive0001_2019_4
    prive0001_2019_10
    prive0001_2019_10
    prive0001_2019_21

  6. #6
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    merci SergioMaster

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/05/2009, 15h27
  2. utiliser le calendrier pour les champs date
    Par montassar.nizar dans le forum JDeveloper
    Réponses: 3
    Dernier message: 17/08/2008, 14h31
  3. utilise le composant updatesql pour mettre à jour un champ
    Par andyafrique dans le forum C++Builder
    Réponses: 1
    Dernier message: 05/10/2006, 12h48
  4. utilisation d'un domaine pour plusieurs champs
    Par jupierre dans le forum Firebird
    Réponses: 11
    Dernier message: 23/08/2006, 19h45
  5. [DLL] Utilisation d'une DLL pour utiliser serveur Firebird
    Par sekiryou dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/08/2004, 14h20

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