webentwicklung-frage-antwort-db.com.de

Wie kann ich in verschiedenen Fällen nach einer Tabellenspalte sortieren (Oracle)

Wie kann ich eine Tabelle mit einer Spalte von varchar2 mit Zeichen in unterschiedlichen Fällen sortieren (UPPERund lower )?

Wenn ich beispielsweise eine Sortierung nach der Spalte Name durchführe, erhalte ich folgende Ergebnisse:

ANNIE
BOB
Daniel
annie
bob

Was ich will ist so etwas:

ANNIE
annie
BOB
bob
Daniel
22
acidRain

Verwenden Sie lower(field), z. 

select * from tbl order by lower(name)

Wenn Sie Sonderzeichen für nicht-englische Sprachen ansprechen müssen, sind die anderen Antworten zu NLSSORT möglicherweise das, was Sie brauchen. Wenn Sie dies nicht tun, würde ich versuchen, KISS zu verwenden und lower() zu verwenden, da es sehr einfach ist, sich daran zu erinnern, es zu benutzen und von anderen gelesen zu werden (Wartbarkeit).

36
Michael Durrant

Eine weitere Option ist die Verwendung der Funktion NLSSORT zum Ausführen von linguistischer Sortierung :

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

Die Vorteile sind mehr Flexibilität. Man kann Charaktere mit Akzenten sowie verschiedene Fälle zusammen sortieren. Einige Zeichen können sprachspezifisch behandelt werden, indem andere Werte für NLS_SORT angegeben werden. Definiert eine Reihenfolge innerhalb der Menge äquivalenter Zeichen. 'A' und 'a' werden also sortiert, aber innerhalb von 'a' steht der Großbuchstabe an erster Stelle. Nachteile Ich erwarte, dass NLSSORT mehr CPU als LOWER verwendet, obwohl ich es nicht benotigt habe. Und NLSSORT verwendet nur ein Präfix aus längere Zeichenfolgen :

Die zurückgegebene Zeichenfolge, auch Kollatierungsschlüssel genannt, ist vom Typ RAW-Daten . Die Länge des Kollatierungsschlüssels, der sich aus einem bestimmten char - Wert für eine bestimmte Kollatierung ergibt, kann 2000 Byte überschreiten. Dies ist die Maximale Länge des von NLSSORT zurückgegebenen RAW-Werts. In diesem Fall berechnet NLSSORT den Kollatierungsschlüssel für ein maximales Präfix oder einen ersten Teilstring von char, damit das berechnete Ergebnis 2000 Bytes nicht überschreitet. Für einsprachige Kollatierungen, z. B. FRANZÖSISCH, beträgt die Länge des Präfixes Normalerweise 1000 Zeichen. Bei mehrsprachigen Kollatierungen beträgt das Präfix für Beispiel GENERIC_M normalerweise 500 Zeichen. Die exakte Länge Kann je nach Kollatierung und den Zeichen In char niedriger oder höher sein.

12

Wenn Sie relativ aktuelle Versionen von Oracle verwenden, sollten Sie eher NLS_SORT/NLS_COMP einstellen als die Funktion LOWER () verwenden.

Wenn Sie die Instanz nicht global beeinflussen möchten, können Sie die Funktion NLSSORT () verwenden, um NLS_SORT für den Umfang einer bestimmten Abfrage festzulegen.

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

Ein gutes Beispiel dafür finden Sie hier.

7
Mark J. Bobak

Sie können INITCAP verwenden, z.

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