Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/01/2011, 15h12   #1
Invité régulier
 
Inscription : mai 2006
Messages : 21
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2006
Messages : 21
Points : 8
Points : 8
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 :
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 :
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 :
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.
krolineeeeeeee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 15h27   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Votre tri est en fait dépendant de vos paramètres locaux, je pense que vous triez en Français :
Code :
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 :
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 :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 15h28   #3
Rédacteur
 
Inscription : décembre 2002
Messages : 2 385
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 385
Points : 3 261
Points : 3 261
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 :
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 :
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 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h08   #4
Invité régulier
 
Inscription : mai 2006
Messages : 21
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2006
Messages : 21
Points : 8
Points : 8
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.
krolineeeeeeee est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h28.


 
 
 
 
Partenaires

Hébergement Web