Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ORACLE: Sortierung von NULL-Werten

35 views
Skip to first unread message

Martin Meyer

unread,
Apr 4, 2008, 3:15:43 PM4/4/08
to
Hallo NG,

ORA sortiert NULL-Werte bei aufsteigender Sortierreihenfolge von Feldern
-egal welchen Typs- bekanntlich immer zuletzt ein.
Ich weiss zwar nicht welcher Sinn dahinter steckt, aber die anderen
unterstützten Backends meiner Anwendung sortieren die NULLer immer
zuerst, was mir auch einleuchtet. Ich brauche die NULLer jedenfalls am
Anfang.

Ok, man kann nun mit NLS() in der ORDER BY-Klausel was tricksen, aber das
ist bei dynamisch generierten Queries etwas nervig, weil hier für ORA
extra wieder Ausnahmen in die Routinen eingebaut werden müssen.
Ebenfalls scheint das NLS() auch einiges an Performance zu kosten.

Habe ich vielleicht einen Parameter übersehen, mit dem man bei ORA das
Sortierverhalten von NULL-Werten generell umstellen kann?
Oder gibt es eine bessere Lösung als die NLS-Funktion in der Klausel um
sie gewünschte Sortierung zur erzielen?

THX & Gruß,
Martin

--
Bei Antworten per eMail bitte an die Reply-To Adresse senden.
Oder der From-Adresse den String "nospam_" voranstellen.
eMails an die unmodifizierte From-Adresse werden ungelesen geloescht.

Tim Landscheidt

unread,
Apr 4, 2008, 3:26:31 PM4/4/08
to
Martin Meyer <mme...@nurfuerspam.de> wrote:

> [...]


> Habe ich vielleicht einen Parameter übersehen, mit dem man bei ORA das
> Sortierverhalten von NULL-Werten generell umstellen kann?
> Oder gibt es eine bessere Lösung als die NLS-Funktion in der Klausel um
> sie gewünschte Sortierung zur erzielen?

Bei ORACLE ahnungslos würde ich "ORDER BY Field IS NOT NULL,
Field" bzw. "ORDER BY Field IS NULL DESC, Field" verwenden;
wenn es unbedingt ein einzelner Ausdruck sein muss, "ORDER
BY COALESCE(Field, '')".

Ungetestet,
Tim

Dorothea Kühn

unread,
Apr 4, 2008, 4:09:29 PM4/4/08
to
Martin Meyer <mme...@nurfuerspam.de> schrieb:
[...]

> Habe ich vielleicht einen Parameter übersehen, mit dem man bei ORA das
> Sortierverhalten von NULL-Werten generell umstellen kann?

Ja.
ORDER BY field [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ]

Siehe Doku (hier für 10g, das geht aber, soweit ich sehe, schon
mindestens seit 8i)
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_10002.htm#i2168299

Gruß, dekay

Matthias Lippmann

unread,
Apr 4, 2008, 4:10:51 PM4/4/08
to
Hallo Martin,

Martin Meyer schrieb


> ORA sortiert NULL-Werte bei aufsteigender Sortierreihenfolge von Feldern
> -egal welchen Typs- bekanntlich immer zuletzt ein.
> Ich weiss zwar nicht welcher Sinn dahinter steckt, aber die anderen
> unterstützten Backends meiner Anwendung sortieren die NULLer immer
> zuerst, was mir auch einleuchtet. Ich brauche die NULLer jedenfalls am
> Anfang.

der Order-By Klausel kann man optional für jede Spalte NULLS LAST
bzw. NULLS FIRST anhängen:

.... ORDER BY Spalte NULLS FIRST

Grüße,

Lippi
--
www.lippmannsoft.de



Martin Meyer

unread,
Apr 4, 2008, 4:51:27 PM4/4/08
to
Hallo Tim,

vielen Dank für die Antwort!
Arrgr ... sorry, ich meinte natürlich die NVL-FKT, nicht NLS.

On Fri, 04 Apr 2008 19:26:31 +0000, Tim Landscheidt
<t...@tim-landscheidt.de> wrote:

>[...]


>Bei ORACLE ahnungslos würde ich "ORDER BY Field IS NOT NULL,
>Field" bzw. "ORDER BY Field IS NULL DESC, Field" verwenden;
>wenn es unbedingt ein einzelner Ausdruck sein muss, "ORDER
>BY COALESCE(Field, '')".

COALESCE ist nur die allgemeinere Form von NVL. Bei COALESCE können halt
mehre Expressions als Parameter angegeben werden.
Und Field IS [NOT] NULL scheint in der Order-Klausel nicht erlaubt zu
sein.

THX und Gruß,

Martin Meyer

unread,
Apr 4, 2008, 4:51:23 PM4/4/08
to
Hallo Matthias und dekay,

jau, habe das Naheliegende natürlich übersehen, hätte mal die Doku
hinsichtlich der ORDER-By-Syntax checken sollen <:-|

On Fri, 4 Apr 2008 22:10:51 +0200, "Matthias Lippmann"
<ne...@lippmannsoft.de> wrote:

>[...]


>der Order-By Klausel kann man optional für jede Spalte NULLS LAST
>bzw. NULLS FIRST anhängen:
>
>.... ORDER BY Spalte NULLS FIRST

Zu meiner Entschuldigung kann ich aber anführen, dass dies nicht genau
das war wonach ich suchte.
Zugegeben, dies ist natürlich besser als die Krücke mit dem NVL(), aber
erfordert für ORA natürlich wieder eine Sonderbehandlung bei der
Query-Generierung.

Am liebsten wäre mir eine grundsätzliche Umstellung des
Sortierverhaltens, wie bei zB. ALTER SESSION mit NLS_SORT-Einstellung in
bezug auf die linguistisch korrekte Sortierung.

Trotzdem schon mal Dank!

Nils Ketelsen

unread,
Apr 5, 2008, 5:46:04 AM4/5/08
to
Martin Meyer <mme...@nurfuerspam.de> wrote:

> On Fri, 4 Apr 2008 22:10:51 +0200, "Matthias Lippmann"
> <ne...@lippmannsoft.de> wrote:

>>.... ORDER BY Spalte NULLS FIRST
>
> Zu meiner Entschuldigung kann ich aber anführen, dass dies nicht genau
> das war wonach ich suchte.
> Zugegeben, dies ist natürlich besser als die Krücke mit dem NVL(), aber
> erfordert für ORA natürlich wieder eine Sonderbehandlung bei der
> Query-Generierung.

Der vernünftige Ansatz wäre wohl, sein Datenmodell so zu ändern, daß keine
NULLs vokommen.

IMHO könnte Oracle die NULLs auch in die Mitte werfen oder völlig zufällig
einstreuen, denn NULL ist ja nicht 0, sondern undefiniert... und damit nicht
sortierbar, denn ist "ein Wert der nicht definiert ist" nun größer oder
kleiner als (zum Beispiel) 17?

Wenn also eine Spalte vorliegt, nach der sortiert werden können muß, dann
ist es am Designer des Schemas dafür zu sorgen, daß da nie NULL drin steht.

Nils
--
ich hab die Zukunft eingeholt
doch sie hat mir den Arsch versohlt
sie ist ein übler Fallensteller
denn Du erwachst bei ihr im Keller [J. Witt]

Martin Meyer

unread,
Apr 5, 2008, 6:49:21 AM4/5/08
to
Hallo Nils,

On Sat, 5 Apr 2008 09:46:04 +0000 (UTC), Nils Ketelsen
<ni...@steering-group.net> wrote:

>[...]


>
>Der vernünftige Ansatz wäre wohl, sein Datenmodell so zu ändern, daß keine
>NULLs vokommen.

Ja ok, aber das Datenmodell ist nun mal vorgegeben.
Aber davon abgesehen, ist dieser Ansatz auch ein wenig praxisfremd.
Du hast zB. eine Adress-DB mit Textspalte für Vorname. Was willst Du denn
in das Vornamens-Feld schreiben, wenn dieser nicht vorliegt?
Ein Leerstring gibt's bei ORA nicht. Einen Dummy-Eintrag wie "-keine
Angabe-" o.ä. ist auch nicht das Wahre.

>IMHO könnte Oracle die NULLs auch in die Mitte werfen oder völlig zufällig
>einstreuen, denn NULL ist ja nicht 0, sondern undefiniert... und damit nicht
>sortierbar, denn ist "ein Wert der nicht definiert ist" nun größer oder
>kleiner als (zum Beispiel) 17?

Das ist bei akademischer Betrachtung zwar völlig korrekt - Du wirst nur
Probleme haben, dies einem User klar zu machen. Für den ist "Nichts"
ganz klar kleiner als 17 oder erwartet die Datensätze ohne
Vornamensangabe wie selbstverständlich vor den DS mit Vornamen bei
entsprechenden Sortierungen. Eine Diskussion mit dem durchschnittlichen
Anwender auf dieser Ebene kannst Du getrost sofort vergessen ;-)

cu,

Stefan Graf

unread,
Apr 5, 2008, 6:34:22 AM4/5/08
to
>>>.... ORDER BY Spalte NULLS FIRST
>>
>> Zu meiner Entschuldigung kann ich aber anführen, dass dies nicht genau
>> das war wonach ich suchte.
>> Zugegeben, dies ist natürlich besser als die Krücke mit dem NVL(), aber
>> erfordert für ORA natürlich wieder eine Sonderbehandlung bei der
>> Query-Generierung.
>
> Der vernünftige Ansatz wäre wohl, sein Datenmodell so zu ändern, daß keine
> NULLs vokommen.
>
> IMHO könnte Oracle die NULLs auch in die Mitte werfen oder völlig zufällig
> einstreuen, denn NULL ist ja nicht 0, sondern undefiniert... und damit
> nicht
> sortierbar, denn ist "ein Wert der nicht definiert ist" nun größer oder
> kleiner als (zum Beispiel) 17?
>
> Wenn also eine Spalte vorliegt, nach der sortiert werden können muß, dann
> ist es am Designer des Schemas dafür zu sorgen, daß da nie NULL drin
> steht.

Schlechter Tipp!

NULLs sind ein sehr mächtiges Werkzeug für die Anwendungsentwicklung, wenn
man es denn beherrscht. Das Sortieren nach NULL ist kein Problem, man muss
nur wissen wie.

Leider ist das auch bei professionellen Entwicklungsbuden nicht immer der
Fall. Die Folge davon ist sinnloses Eintragen von Blanks und damit
erhebliche Vergrößerung von Tablespaces.

--
Stefan Graf


0 new messages