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

SQL Oracle Discussion :

Prise en compte du tiret dans les tris


Sujet :

SQL Oracle

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Par défaut Prise en compte du tiret dans les tris
    Bonjour,

    Je pense être en but à un soucis répandu sans avoir pu trouver d'info dessus.

    Une requête triée sur des chaînes de caractères contenant des '-' est incorrectement triée.

    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
     
    Create Table zpozzo_tri (ch1 Varchar2 (10));
     
    Insert Into zpozzo_tri Values ('a-a');
    Insert Into zpozzo_tri Values ('aa');
    Insert Into zpozzo_tri Values ('a-b');
    Insert Into zpozzo_tri Values ('ab');
     
    Select * from zpozzo_tri Order By ch1;
     
    CH1
    a-a
    aa
    a-b
    ab
    J'aurais bien vu a-a, a-b, aa, ab ou à la rigueur aa, ab, a-a, a-b mais là l'ordre m'échappe.

    Idem sous Oracle 10.2 et Oracle 11.2

    J'ai loupé quelque chose ?

    Pozzo

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SQL> SELECT * FROM zpozzo_tri ORDER BY ch1;
     
    CH1
    ----------
    a-a
    a-b
    aa
    ab
    C'est comme-ci le tiret n'existait pas à ton niveau !!

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Je pense que NLS_SORT = BINARY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SQL> Select ascii('-'), ascii('a')
      2  from dual
      3  /
     
    ASCII('-') ASCII('A')
    ---------- ----------
            45         97

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Par défaut
    L'approche par les codes ascii est bonne car au répart je me suis dit que ce que je voyais était inexact. J'ai donc fait un dump des champs.

    Eh bien si on examine le code ascii la séquence n'est pas logique
    a-a
    aa
    a-b
    ab

    Ca donne :
    97 45 97
    97 97
    97 45 98
    97 98

    Pas bon.
    Pozzo

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous pouvez choisir votre ordre de tri avec NLSSORT si vous ne voulez pas modifier votre paramétrage.
    Essayez donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM zpozzo_tri ORDER BY nlssort(ch1, 'nls_sort=binary');
     
    SELECT * FROM zpozzo_tri ORDER BY nlssort(ch1, 'nls_sort=french');

  6. #6
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Je dirais même :
    Ton test montre qu'effectivement ton tri n'est pas binaire. Pour visualiser quelles sont les "valeurs" utilisées par le tri linguistique, tu peux l'afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SQL> select ch1, nlssort(ch1, 'NLS_SORT=FRENCH') srt from zpozzo_tri order by nlssort(ch1, 'nls_sort=french');
     
    CH1        SRT
    ---------- --------------------------------------------------
    a-a        14140002002D0200
    aa         141400020200
    a-b        14190002002D0200
    ab         141900020200
    Par ailleurs :
    http://docs.oracle.com/cd/B14117_01/...t.htm#i1006286

    Ignorable Characters

    Some characters can be ignored in a linguistic sort. These characters are called ignorable characters. There are two kinds of ignorable characters: diacritics and punctuation.

    Examples of ignorable diacritics are:

    ^, so that rôle is treated the same as role

    The umlaut, so that naïve is treated the same as naive

    An example of an ignorable punctuation character is the dash character -. If it is ignored, then multi-lingual can be treated that same as multilingual and e-mail can be treated the same as email.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Par défaut Ok
    Merci à vous c'est clair et limpide.

    problème résolu.

    Merci encore.

    Pozzo

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

Discussions similaires

  1. Ajouter des tirets dans les prénoms composés ?
    Par Phileufeu dans le forum Excel
    Réponses: 1
    Dernier message: 12/11/2008, 00h27
  2. prise en compte des accents dans mes variables
    Par paolo2002 dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 29/02/2008, 17h17
  3. [URL Rewriting] Prise en compte du slash dans ma règle
    Par Joseph345 dans le forum Apache
    Réponses: 3
    Dernier message: 02/02/2008, 21h34
  4. Réponses: 2
    Dernier message: 07/05/2007, 08h06
  5. Pb de prise en compte des accents dans jdk1.5
    Par NizarK dans le forum Langage
    Réponses: 3
    Dernier message: 23/03/2007, 15h10

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