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

Développement SQL Server Discussion :

Order by sur varchar


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Points : 177
    Points
    177
    Par défaut Order by sur varchar
    Bonjour,

    je fais un tri sur une colonne varchar
    le résultat est :
    3-92734 - 10-245734
    3-92734 - 11-144630
    3-92734 - 1-144623
    3-92734 - 12-245743
    3-92734 - 13-144632
    3-92734 - 15-248365
    3-92734 - 16-245784
    3-92734 - 17-144634
    3-92734 - 18-144635
    3-92734 - 19-297368
    3-92734 - 20-144636
    3-92734 - 21-144637
    3-92734 - 2-248375
    3-92734 - 24-144639
    3-92734 - 25-144640
    3-92734 - 26-144641
    3-92734 - 28-144642
    3-92734 - 29-245782
    3-92734 - 30-144643
    3-92734 - 31-144644
    3-92734 - 3-144625
    3-92734 - 32-248377
    3-92734 - 34-144646
    3-92734 - 35-144647
    3-92734 - 37-144648
    3-92734 - 37-248355
    3-92734 - 4-144631
    3-92734 - 5-144626
    3-92734 - 6-144627
    3-92734 - 7-144628
    3-92734 - 8-144629
    3-92734 - 9-245735
    pouvez me dire pourquoi ce n'est pas
    3-92734 - 1-144623
    qui arrive en 1er de la liste
    et surtout comment dois je m'y prendre pour que ce soit le cas
    Merci de votre aide

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Les lettres n'étant pas des nombres et vice versa, l'ordre de tri est celle de la séquence de collation des lettres dans la chaine (French_CI_AS probablement dans votre cas).

    Avec une collation différentes, vous obtiendrez un tri différent.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    -- la table :
    CREATE TABLE TTTTT (V VARCHAR(255));
    GO
    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    -- les données :INSERT INTO TTTTT VALUES
    ('3-92734 - 10-245734'),
    ('3-92734 - 11-144630'),
    ('3-92734 - 1-144623'),
    ('3-92734 - 12-245743'),
    ('3-92734 - 13-144632'),
    ('3-92734 - 15-248365'),
    ('3-92734 - 16-245784'),
    ('3-92734 - 17-144634'),
    ('3-92734 - 18-144635'),
    ('3-92734 - 19-297368'),
    ('3-92734 - 20-144636'),
    ('3-92734 - 21-144637'),
    ('3-92734 - 2-248375'),
    ('3-92734 - 24-144639'),
    ('3-92734 - 25-144640'),
    ('3-92734 - 26-144641'),
    ('3-92734 - 28-144642'),
    ('3-92734 - 29-245782'),
    ('3-92734 - 30-144643'),
    ('3-92734 - 31-144644'),
    ('3-92734 - 3-144625'),
    ('3-92734 - 32-248377'),
    ('3-92734 - 34-144646'),
    ('3-92734 - 35-144647'),
    ('3-92734 - 37-144648'),
    ('3-92734 - 37-248355'),
    ('3-92734 - 4-144631'),
    ('3-92734 - 5-144626'),
    ('3-92734 - 6-144627'),
    ('3-92734 - 7-144628'),
    ('3-92734 - 8-144629'),
    ('3-92734 - 9-245735 ')
    La bonne requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM   TTTTT
    ORDER  BY V COLLATE French_BIN
    le résultat :

    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    3-92734 - 1-144623
    3-92734 - 10-245734
    3-92734 - 11-144630
    3-92734 - 12-245743
    3-92734 - 13-144632
    3-92734 - 15-248365
    3-92734 - 16-245784
    3-92734 - 17-144634
    3-92734 - 18-144635
    3-92734 - 19-297368
    3-92734 - 2-248375
    3-92734 - 20-144636
    3-92734 - 21-144637
    3-92734 - 24-144639
    3-92734 - 25-144640
    3-92734 - 26-144641
    3-92734 - 28-144642
    3-92734 - 29-245782
    3-92734 - 3-144625
    3-92734 - 30-144643
    3-92734 - 31-144644
    3-92734 - 32-248377
    3-92734 - 34-144646
    3-92734 - 35-144647
    3-92734 - 37-144648
    3-92734 - 37-248355
    3-92734 - 4-144631
    3-92734 - 5-144626
    3-92734 - 6-144627
    3-92734 - 7-144628
    3-92734 - 8-144629
    3-92734 - 9-245735
    heureusement que vous êtes sous SQL Server, parce que avec n'importe quel autre SGBDR c'est infaisable !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Points : 177
    Points
    177
    Par défaut
    Merci beaucoup pour la réponse je n'aurais jamais pensé à ça

    Mais l'ordre que je voudrais avoir est

    3-92734 - 1-144623
    3-92734 - 2-248375
    3-92734 - 3-144625
    3-92734 - 4-144631
    3-92734 - 5-144626
    3-92734 - 6-144627
    3-92734 - 7-144628
    3-92734 - 8-144629
    3-92734 - 9-245735
    3-92734 - 10-245734
    3-92734 - 11-144630
    3-92734 - 12-245743
    3-92734 - 13-144632
    3-92734 - 15-248365
    3-92734 - 16-245784
    3-92734 - 17-144634
    3-92734 - 18-144635
    3-92734 - 19-297368
    3-92734 - 20-144636
    3-92734 - 21-144637
    3-92734 - 24-144639
    3-92734 - 25-144640
    3-92734 - 26-144641
    3-92734 - 28-144642
    3-92734 - 29-245782
    3-92734 - 30-144643
    3-92734 - 31-144644
    3-92734 - 32-248377
    3-92734 - 34-144646
    3-92734 - 35-144647
    3-92734 - 37-144648
    3-92734 - 37-248355
    Dsl j'aurais du le préciser dans mon 1er post

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    ça n'est pas possible de manière simple et cela pour deux raisons :
    1) vous violez la première forme normale (les données d'un attribut doivent être atomiques)
    2) vous utilisez des littéraux et essayez de les faire se transformer magiquement en nombres !

    Le mieux serait de normaliser votre base et tout rentrera dans l'ordre !

    le viol de la première forme normale est le plus courant et hélas le pire dans tous les cas de figure (performances, lisibilité, accès aux données, construction des requêtes, etc !)

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Points : 177
    Points
    177
    Par défaut
    il n'existe pas une astuce pour contourner le problème ?
    comme par exemple, convertir les chiffres en leur équivalent alphabétique
    3-92734 - 1-144623
    deviendrait
    3-92734 - A-144623

    Ou bien ajouter un zero devant les chiffres < 10

    select CAST(am3_type_entite.ordre_affichage AS NVARCHAR(255))
    quand ordre_affichage < 10

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Points : 177
    Points
    177
    Par défaut
    Je viens de tester cette solution qui apparemment correspond à ce dont j'aurais besoin :

    select CAST(am3_type_entite.ordre_affichage AS NVARCHAR(255))
    devient
    select right(replicate('0',2)+CAST(am3_type_entite.ordre_affichage AS NVARCHAR(255)),2)
    et ça me met le bon ordre

    1-197867
    2-161154
    3-92734
    3-92734-01-144623
    3-92734-02-248375
    3-92734-03-144625
    3-92734-04-144631
    3-92734-05-144626
    3-92734-06-144627
    3-92734-07-144628
    3-92734-08-144629
    3-92734-09-245735
    3-92734-10-245734
    3-92734-11-144630
    3-92734-12-245743
    une critique ? un avis ?

    Merci

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Ce sera toujours épouvantablement lent et de pire en pire au fur et à mesure de l'augmentation du volume des données, jsquu'à devenir inexploitable.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. SELECT ORDER BY sur VARCHAR alphanumérique bizarre
    Par trent94 dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/03/2013, 16h27
  2. Réponses: 10
    Dernier message: 12/09/2011, 13h22
  3. ORDER BY sur type VARCHAR
    Par ep31 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/10/2007, 15h20
  4. Faire un ORDER BY sur un champ
    Par Jeankiki dans le forum Bases de données
    Réponses: 3
    Dernier message: 02/05/2004, 23h59
  5. order by sur plusieurs tables
    Par Mad_Max dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/12/2003, 12h17

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