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

Oracle Discussion :

Problème de select borné par 2 varchar


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut Problème de select borné par 2 varchar
    Bonjour,

    Voilà mon problème.
    J'ai une table fournisseur dans laquelle j'essaye de faire la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM FOURNIS
     WHERE FOURNIS >= 'ABAQ' AND FOURNIS<= 'A.B.C.Q.C.A'
     ORDER BY FOURNIS
    Cette requête ne retourne aucun résultat.

    Voici un extrait de ma table retourner avec un ORDER BY FOURNIS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CODE   |   FOURNIS
    --------|-----------------------------
     10940  | ABAQ
     6227    | ABBOTT FRANCE
     9083    | ABBOTT PRODUCT
     10080  | ABC OBJECTIF-PMSI PILOT
     10139  | ABCAM
     7891   |  A.B.C.Q.C.A
    J'ai tenter d'inverser les bornes et j'ai obtenu ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     CODE   |   FOURNIS
    --------|-----------------------------
     10940  |  ABAQ
      7891   | A.B.C.Q.C.A
    Quelqu'un aurait une explication? et surtout une solution?
    Car je pense que le problème vient des "points" dans A.B.C.Q.C.A mais je ne sais pas comment faire... (Il faut que ma solution fonctionne aussi sur SQL serveur)

    Merci beaucoup pour votre aide.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Votre tri est en fait dépendant de vos paramètres locaux, je pense que vous triez en Français :
    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
     
    with FOURNIS as 
    (
    select 10940 as cde, 'ABAQ' as nom             from dual union all 
    select  6227       , 'ABBOTT FRANCE'           from dual union all
    select  9083       , 'ABBOTT PRODUCT'          from dual union all
    select 10080       , 'ABC OBJECTIF-PMSI PILOT' from dual union all
    select 10139       , 'ABCAM'                   from dual union all
    select  7891       , 'A.B.C.Q.C.A'             from dual union all
    select     1       , 'AA-EXCLU'                from dual union all
    select     2       , 'BB-EXCLU'                from dual
    )
      SELECT cde, nom
        FROM FOURNIS
    ORDER BY nlssort(nom, 'NLS_SORT=French');
     
           CDE NOM                    
    ---------- -----------------------
             1 AA-EXCLU               
         10940 ABAQ                   
          6227 ABBOTT FRANCE          
          9083 ABBOTT PRODUCT         
         10080 ABC OBJECTIF-PMSI PILOT
         10139 ABCAM                  
          7891 A.B.C.Q.C.A            
             2 BB-EXCLU
    En français les lettres sont "avant" la ponctuation.

    Par contre toutes les opérations de calcul et de comparaisons sont faites avec le tri binaire :
    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
    with FOURNIS as 
    (
    select 10940 as cde, 'ABAQ' as nom             from dual union all 
    select  6227       , 'ABBOTT FRANCE'           from dual union all
    select  9083       , 'ABBOTT PRODUCT'          from dual union all
    select 10080       , 'ABC OBJECTIF-PMSI PILOT' from dual union all
    select 10139       , 'ABCAM'                   from dual union all
    select  7891       , 'A.B.C.Q.C.A'             from dual union all
    select     1       , 'AA-EXCLU'                from dual union all
    select     2       , 'BB-EXCLU'                from dual
    )
      SELECT cde, nom
        FROM FOURNIS
    ORDER BY nlssort(nom, 'NLS_SORT=Binary');
     
           CDE NOM                    
    ---------- -----------------------
          7891 A.B.C.Q.C.A            
             1 AA-EXCLU               
         10940 ABAQ                   
          6227 ABBOTT FRANCE          
          9083 ABBOTT PRODUCT         
         10080 ABC OBJECTIF-PMSI PILOT
         10139 ABCAM                  
             2 BB-EXCLU
    Ici la ponctuation précède les lettres, et c'est en ligne ce que vous retrouvez avec vos comparaisons dans le WHERE.

    Pour vous en sortir vous pouvez utiliser cette même fonction dans le WHERE, mais c'est pas terrible (voir performance sur grosse volumétrie), si vous pouviez trouver d'autres critères ce serait mieux :
    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
    with FOURNIS as 
    (
    select 10940 as cde, 'ABAQ' as nom             from dual union all 
    select  6227       , 'ABBOTT FRANCE'           from dual union all
    select  9083       , 'ABBOTT PRODUCT'          from dual union all
    select 10080       , 'ABC OBJECTIF-PMSI PILOT' from dual union all
    select 10139       , 'ABCAM'                   from dual union all
    select  7891       , 'A.B.C.Q.C.A'             from dual union all
    select     1       , 'AA-EXCLU'                from dual union all
    select     2       , 'BB-EXCLU'                from dual
    )
      SELECT cde, nom
        FROM FOURNIS
       WHERE nlssort(nom, 'NLS_SORT=French') >= nlssort('ABAQ'       , 'NLS_SORT=French')
         AND nlssort(nom, 'NLS_SORT=French') <= nlssort('A.B.C.Q.C.A', 'NLS_SORT=French');
     
           CDE NOM                    
    ---------- -----------------------
         10940 ABAQ                   
          6227 ABBOTT FRANCE          
          9083 ABBOTT PRODUCT         
         10080 ABC OBJECTIF-PMSI PILOT
         10139 ABCAM                  
          7891 A.B.C.Q.C.A

  3. #3
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    L'ordre de tri dépend du paramètre NLS_SORT.
    Dans l'ordre de tri binaire, le point est inférieur au B, mais dans l'ordre lexicographique français, le point est supérieur au B.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL> alter session set nls_sort=binary;
     
    SQL> select * from test order by 1;
     
    A
    ------------------------------
    A.B.C.Q.C.A
    ABAQ
    ABBOTT FRANCE
    ABBOTT PRODUCT
    ABC OBJECTIF-PMSI PILOT
    ABCAM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL> alter session set nls_sort=french;
     
    SQL> select * from test order by 1;
     
    A
    ------------------------------
    ABAQ
    ABBOTT FRANCE
    ABBOTT PRODUCT
    ABC OBJECTIF-PMSI PILOT
    ABCAM
    A.B.C.Q.C.A
    Edit : j'ai été devancé par Waldar !
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Un grand Merci pour votre aide!
    Je n'ai pas résolu mon problème mais j'ai pu mettre une explication dessus.
    L'ajout du nlssort(MONCHAMP, 'NLS_SORT=French') dans le where est trop gourmand, et je ne sais pas si cela fonctionne sous SQL Serveur.

    Merci en tout cas.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/03/2014, 10h49
  2. un SELECT borné par une variable JS
    Par rragnarok dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 04/09/2007, 05h15
  3. problème DBLookupListBox selection
    Par kardevlop dans le forum Bases de données
    Réponses: 11
    Dernier message: 17/08/2004, 11h53
  4. Ajout de critères dans Select utilisé par xp_sendmail
    Par bd0606 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 28/05/2004, 17h02
  5. problème de connection mysql par tcp/ip
    Par leroyphil dans le forum Administration
    Réponses: 5
    Dernier message: 04/09/2003, 18h27

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