Max: Sortierung im Select...

Hi, gibt es auch die Möglichkeit einer Sortierung beim Select, in der nur die ersten 4 Zeichen der Spalte nach der man sortieren möchte, berücksichtigt werden?

  1. ORDER BY LEFT('spalte',4)
    So müsste es gehen glaube ich.

    1. Hallo,

      ORDER BY LEFT('spalte',4)

      fast. Keine einfachen Anführungszeichen um den Spaltennamen.

      Entweder keine Maskierungszeichen, wenn der Spaltenname das nicht erfordert oder solche Maskierungszeichen, die das Datenbankmanagementsystem versteht: nahezu jedes DBMS kennt einen Modus, indem doppelte Anführungszeichen erlaubt sind (ANSI-Quotes, ANSI-Modus, ...) und ansonsten kochen viele DBMS ihr eigenes Süppchen. Ein paar Beispiele: Microsoft (sowohl MS SQL Server als auch Access) nutzt eckige Klammern, MySQL Backticks.

      In Programmcode - d.h. wenn man SQL nicht von Hand schreibt - ist es eine gute Idee, solche Namen immer zu quoten - auch wenn ich persönlich fast immer solche Namen verwende, die nicht gequotet werden müssen.

      Freundliche Grüße

      Vinzenz

      1. Vielen Dank!

        Hat prima geklappt, während meine Versuche via substr zuvor kläglich scheiterten...

  2. Moin!

    Hi, gibt es auch die Möglichkeit einer Sortierung beim Select, in der nur die ersten 4 Zeichen der Spalte nach der man sortieren möchte, berücksichtigt werden?

    Ich frage mich ja immer gerne nach dem Sinn, den ein solches Vorhaben hat.

    Da wird also nun nur nach den ersten vier Buchstaben sortiert. Und dann - alles, was danach kommt, ist egal und wird zufällig angeordnet? Dann ist also der Fall, in dem man nach ALLEN Zeichen sortieren würde, genau einer dieser zufälligen Fälle und damit erlaubt? Warum dann nicht nach ALLEN Zeichen sortieren, was vermutlich deutlich performanter ablaufen wird?

    - Sven Rautenberg

    1. Also das Vorhaben hat schon einen Sinn.
      In der relevanten Spalte sind teilweise Kennziffern angehängt, die die Sortierung beeinflussen würden.
      Z.B. :
      Der Schlüsselwert '5200' in der Spalte key steht für einen bestimmten Typ von Datensatz, innerhalb dieses Schlüsselwertes soll nach der Spalte Name sortiert werden.
      Manche Werte in der Spalte key sehen aber auch so aus: '5200-1' oder '5200-2'.

      Da ich aber strikt nach dem eigentlich Datensatztyp, der eben nur durch die ersten 4 Ziffern sortieren möchte, dürfen die zusätzlichen Kennziffern, die nur in einer anderen Ausgaberoutine eine Rolle spielen, keine Rolle spielen.

      Alles klar? ;)

      1. Hallo,

        In der relevanten Spalte sind teilweise Kennziffern angehängt, die die Sortierung beeinflussen würden.

        das ist keine besonders gute Idee.

        Der Schlüsselwert '5200' in der Spalte key steht für einen bestimmten Typ von Datensatz, innerhalb dieses Schlüsselwertes soll nach der Spalte Name sortiert werden.
        Manche Werte in der Spalte key sehen aber auch so aus: '5200-1' oder '5200-2'.

        Alles klar? ;)

        Verbessere das Tabellenmodell, z.B. durch Hinzufügen einer weiteren Spalte, die die Kennziffern enthält. Aus

        key  | kennziffer
        -----+-----------
        5200 | 1
        5200 | 2

        läßt sich sehr leicht die berechnete Spalte mit den Werten

        5200-1
        5200-2

        erstellen. Ein kombinierter Index über die beiden Spalten sorgt für Eindeutigkeit, falls dies erforderlich sein sollte. Die Sortierung wird Dir nun viel leichter fallen.

        Freundliche Grüße

        Vinzenz

        1. Danke für den Tip.Ich hätte das auch liebend gerne von Anfang an so gehandhabt. Aber leider darf ich die Spalte nicht ändern bzw. Daten hinzufügen, weil die Tabelle im- bzw. exportiert werden muss und an dieser noch andere Leute via SAP arbeiten.
          Hierbei müßte ich beim Import der Daten (habe mir ein kleines script gebastelt um die csv-Datei, welche ich einmal pro Woche erhalte) etwa 60.000 Datensätze (Zeilen) jeweils wieder auseinander pflücken um die relvante Spalte aufzuspalten und die Kennziffern in einer Extra-Spalte, die wie ich umumwunden zugebe absulut Sinn macht, einzutragen.

          Naja, es klappt nun auch mit der Select-Variante. Ist nicht die eleganteste Lösung, aber es läuft und das ist schon mal viel wert!

      2. Hi!

        Also das Vorhaben hat schon einen Sinn.

        Ich erkenne ihn genausowenig wie Sven.

        In der relevanten Spalte sind teilweise Kennziffern angehängt, die die Sortierung beeinflussen würden.

        Wenn du es nicht genauer spezifizierst, dann bekommst du bei zwei gleichen Werten keine Garantie zur Reihenfolge des Ergebnisses.

        Manche Werte in der Spalte key sehen aber auch so aus: '5200-1' oder '5200-2'.

        Du bekommst also - mal nur diese beiden Werte betrachtet - mit theoretisch 50% Wahrscheinlichkeit

        '5200-1'
          '5200-2'

        oder

        '5200-2'
          '5200-1'

        geliefert. Deine Reihenfolge wird nun also nicht mehr von deiner Sortierung sondern vom Zufall beeinflusst. Dass das DBMS von sich aus die Reihenfolge beibehält, so wie die Datensätze physisch oder zeitlich irgendwann mal geschrieben wurden, darauf solltest du dich nicht verlassen. Ein DBMS sichert dir das jedenfalls nicht zu. Besser wäre, wenn du zusätzlich zum LEFT(spalte, 4) noch ein zweites Kriterium angibst, dass eine gewünschte Reihenfolge garantiert.

        Da ich aber strikt nach dem eigentlich Datensatztyp, der eben nur durch die ersten 4 Ziffern sortieren möchte, dürfen die zusätzlichen Kennziffern, die nur in einer anderen Ausgaberoutine eine Rolle spielen, keine Rolle spielen.

        Wie gesagt, es ist keine strikte Sortierung, wenn du den Rest dem Zufall überlässt.

        Lo!

        1. Hi!

          Ich überlasse den Rest nicht dem Zufall.
          Primär wird nach den ersten 4 Ziffern des Schlüssels sortiert und danach asc nach Namen. Somit habe ich das was ich wollte.
          Erst nach Datensatztyp, innerhalb des Typs nach Namen.

          1. Hi!

            Ich überlasse den Rest nicht dem Zufall.
            Primär wird nach den ersten 4 Ziffern des Schlüssels sortiert und danach asc nach Namen. Somit habe ich das was ich wollte.
            Erst nach Datensatztyp, innerhalb des Typs nach Namen.

            Ah gut, so wird zumindest funktional ein Schuh draus. Somit habe ich keinen Grund mehr, in deinem Vorgehen einen versteckten Fehler zu sehen, und Sven vermutlich auch nicht.

            Was die Performance angeht, ist jedoch das Verwenden von Funktionen bei Auswahl- und Sortierkriterien immer auch kritisch zu sehen. Denn das DBMS muss in dem Fall bei jedem noch im Rennen befindlichen Datensatz diese Funktion anwenden und kann nicht auf einen schnellen Index zurückgreifen. Ausnahmen bilden hier Systeme, die einen funktionsbasierenden Index erlauben.

            Lo!