web-dev-qa-db-fra.com

Comment puis-je trier par colonne de table dans différents cas (Oracle)

Comment puis-je trier une table avec une colonne de varchar2 avec des caractères dans différents cas (UPPERet lower )?

Par exemple, lorsque je fais un ordre selon la colonne Nom, j'obtiens les résultats suivants:

ANNIE
BOB
Daniel
annie
bob

Ce que je veux c'est quelque chose comme ça:

ANNIE
annie
BOB
bob
Daniel
22
acidRain

Utilisez lower(field), par exemple 

select * from tbl order by lower(name)

Si vous avez besoin d’adresser des caractères spéciaux pour des langues autres que l’anglais, alors les autres réponses à propos de NLSSORT peuvent être ce dont vous avez besoin. Si vous ne le faites pas, j'essaierais de KISS et d'utiliser lower() car il est très facile de s'en souvenir, de l'utiliser et d'être lu par d'autres (facilité de maintenance).

36
Michael Durrant

Une autre option consiste à utiliser la fonction NLSSORT pour effectuer tri linguistique :

SQL> with test as (select 'ANNIE' as col from dual
  2      union all select 'BOB' from dual
  3      union all select 'Daniel' from dual
  4      union all select 'annie' from dual
  5      union all select 'bob' from dual
  6      union all select 'Ångström' from dual
  7      union all select 'ångström' from dual)
  8  select col
  9  from test
 10  order by nlssort(col, 'NLS_SORT = WEST_EUROPEAN')
 11  /

COL
----------
Ångström
ångström
ANNIE
annie
BOB
bob
Daniel

Les avantages sont plus de flexibilité. On peut trier les caractères avec des accents ainsi que différents cas ensemble. On peut choisir de traiter certains caractères d'une manière spécifique à la langue en en spécifiant des valeurs différentes pour NLS_SORT . Définit un ordre dans l'ensemble des caractères équivalents. Donc, «A» et «a» sont triés ensemble, mais dans les «a», les majuscules viennent en premier. Inconvénients Je suppose que NLSSORT utilise plus de CPU que LOWER, bien que je ne l’aie pas marqué. Et NLSSORT utilisera uniquement le préfixe chaînes plus longues :

La chaîne renvoyée, également appelée clé de classement, est de type RAW data . La longueur de la clé de classement résultant d'une valeur char Donnée pour un classement donné peut dépasser 2 000 octets, ce qui correspond à la longueur maximale de la valeur RAW renvoyée par NLSSORT. Dans ce cas, NLSSORT calcule la clé de classement pour un préfixe maximum ou une sous-chaîne initiale De char, de sorte que le résultat calculé ne dépasse pas 2000 Octets. Pour les classements monolingues, par exemple FRANÇAIS, la longueur du préfixe Est généralement de 1000 caractères. Pour les classements multilingues, pour Exemple GENERIC_M, le préfixe est généralement 500 caractères. La longueur exacte Peut être inférieure ou supérieure en fonction de la collation et des caractères Contenus dans le caractère.

12
Shannon Severance

Si vous utilisez des versions relativement récentes d'Oracle, vous devriez définir NLS_SORT/NLS_COMP plutôt que d'utiliser la fonction LOWER ().

Si vous ne souhaitez pas affecter globalement l'instance, vous pouvez utiliser la fonction NLSSORT () pour définir NLS_SORT pour l'étendue d'une requête spécifique.

SQL> create table case_insensitive(a varchar2(10));

Table created.

SQL> insert into case_insensitive values('D');

1 row created.

SQL> 
SQL> 
SQL> c/'D/'c
  1* insert into case_insensitive values('c')
SQL> /

1 row created.

SQL> c/'c/'B
  1* insert into case_insensitive values('B')
SQL> /

1 row created.

SQL> c/'B/'a
  1* insert into case_insensitive values('a')
SQL> /

1 row created.

SQL> commit;

Commit complete.

SQL> select * from case_insensitive;

A
----------
D
c
B
a

SQL> select * from case_insensitive order by a;

A
----------
B
D
a
c

SQL> select * from case_insensitive order by nlssort(a,'NLS_SORT=BINARY_CI'); 

A
----------
a
B
c
D

Un bon exemple de ceci peut être trouvé ici.

7
Mark J. Bobak

Vous pouvez utiliser INITCAP par ex.

SELECT fld FROM tbl ORDER BY INITCAP(fld) ASC;
0
knightz