MSSQL ORDER BY manipulieren



  • Hi,

    ist es eigentlich möglich, für die Sortierung eines Results bestimmten Werten eine bestimmte Wertigkeit zuzuordnen?
    In meinem Fall möchte ich gerne mein Result nach einer INT Spalte sortieren, in der auch NULL stehen kann. Die NULL ist ja normalerweise der kleinste Wert und steht bei ASC Sortierung vorn. Ich möchte aber der NULL den größten Wert zuweisen, sodass sie bei ASC Sortierung hinten steht.



  • heimchen schrieb:

    In meinem Fall möchte ich gerne mein Result nach einer INT Spalte sortieren, in der auch NULL stehen kann. Die NULL ist ja normalerweise der kleinste Wert und steht bei ASC Sortierung vorn.

    Ist NULL wirklich der kleinste Wert? Soviel ich weiß ist das abhängig von der Datenbank und den Datenbankeinstellungen...

    Aber sei es wie es sei, hier eine alternative Lösung:

    Tabelle tbl1 enthält eine int-Spalte spalte1 die Nullwerte zulässt (ungeprüft zusammengehackt):

    SELECT t.*, t.spalte1 als SortOrder
    FROM tbl1 t
    WHERE t.spalte1 IS NOT NULL
    UNION ALL
    SELECT t.*, <DEIN ANGENOMMENER NULL-GEGENWERTWERT> als SortOrder
    FROM tbl1 t
    WHERE t.spalte1 IS NULL
    SORT BY SortOrder
    


  • Ich bin mal vor einer Weile über die IsNull() oder NullValue() Funktion gestolpert (in einem anderen Zusammenhang), die könnte hier auch helfen:

    SELECT * FROM tabelle
    ORDER BY isnull(spalte,1000000)
    

    (wobei du für die Million einen WErt einsetzen solltest, der größer als die regulär vorkommenden Werte ist)



  • Ob man das bei MSSQL umstellen kann, weiß ich nicht. Hab in der Online-Hilfe gefunden, dass NULL immer als kleinster Wert zählt, bei jedem Datentyp (macht ja auch Sinn, kleiner als nix geht ja nicht).

    Angesichts der geringeren Schreibarbeit tendiere ich ja auch zu der Variante mit IsNull(), auch wenn ich es nicht besonders prickelnd finde, dass ich dann ne Aggregatfunktion auf mehrere tausend Datensätze anwende (wenn das jeder machen würde...).



  • heimchen schrieb:

    auch wenn ich es nicht besonders prickelnd finde, dass ich dann ne Aggregatfunktion auf mehrere tausend Datensätze anwende (wenn das jeder machen würde...).

    Hast du denn einen Index auf die Spalte? Wenn nein, ist es vollkommen egal - das Sortieren wird 100x aufwendiger sein als das ISNULL(). (Und wie kommst du darauf dass ISNULL ne Aggregatfunktion ist?)

    p.S.: auch hier kann dir eine Computed-Column helfen, indem du auf diese einen Index machst. Wobei sich auch die Frage stellt ob das Feld überhaupt nullbar sein sollte.

    nochwas:

    dass NULL immer als kleinster Wert zählt, bei jedem Datentyp (macht ja auch Sinn, kleiner als nix geht ja nicht).

    Bei Sortierung, ja. Bei Vergleichen ist das Ergebnis immer false wenn man gegen NULL vergleicht. Also NULL < 1 ist false, genau so wie NULL > 1 false ist.



  • heimchen schrieb:

    Hab in der Online-Hilfe gefunden, dass NULL immer als kleinster Wert zählt, bei jedem Datentyp (macht ja auch Sinn, kleiner als nix geht ja nicht).

    Also für mich hat NULL keinen Punkt auf einer Zahlengerade, und somit auch kein kleiner oder größer. Über den Sinn kann man daher streiten.



  • Is ja gut, is ja gut, NULL bleibt NULL und 0 bleibt 0. 🤡

    Bei mir handelt es sich eigentlich um zwei Tabellen, in der einen stehen Signale, in der anderen Leitungen und das Ergebnis ist ein "Mapping", welches Signal auf welcher Leitung liegt. Es gibt aber auch Signale, die nicht genutzt werden und daher auf keiner Leitung liegen (NULL). Wenn ich mir jetzt eine Belegungsliste ausgebe, möchte ich die Signale sortiert nacht der Leitungsnummer haben. Die nicht genutzen Signale sollen unten angehangen werden, anstatt vor den genutzten zu stehen.


Log in to reply