Frank: SQL-Ergebnisse beim Sortieren ausschließen

Hallo zusammen!

Ich hab folgendes Problem: ich habe eine Tabelle mit einem Fremdschlüssel, der allerdings nicht zwangsläufig belegt ist, z.B.

PK   Name  FK
1    bla   47
2    ho    11
3    aha   0

Das Feld hat das Format Integer, ist also automatisch "0", wenn nix drinsteht.

Jetzt will ich die Datensätze aufsteigend nach FK sortieren und es nervt, dass da am Anfang natürlich immer die mit "0" stehen.

Ich hätte gerne eine Sortierung, die wie folgt aussieht:

PK   Name  FK
2    ho    11
1    bla   47
3    aha   0

Hat irgendjemand eine Idee, wie ich das hinbekommen könnte?

  1. Hallo Frank,

    PK   Name  FK
    1    bla   47
    2    ho    11
    3    aha   0

    Das Feld hat das Format Integer, ist also automatisch "0", wenn nix drinsteht.

    Wenn nichts drinsteht, steht der spezielle Wert NULL in einem Datenbankfeld. Wenn 0 drin steht, steht die Zahl 0 drin; diese Zahl ist etwas ganz anderes als der NULL-Wert und mit beidem wird unterschiedlich umgegangen.

    Jetzt will ich die Datensätze aufsteigend nach FK sortieren und es nervt, dass da am Anfang natürlich immer die mit "0" stehen.

    PK   Name  FK
    2    ho    11
    1    bla   47
    3    aha   0

    Welches Datenbankmanagementsystem verwendest Du? Bitte auch die Version angeben. Davon dürfte es abhängen, wie Du Dein Sortierproblem lösen kannst. Eine einfache Möglichkeit wäre die Verwendung von zwei SELECT-Statements (einmal die Werte mit Eintrag im Feld, einmal die Werte ohne Eintrag), einer weiteren Spalte mit zwei verschiedenen Werten für die beiden SELECT-Statements. Verknüpfe die Ergebnismengen mit UNION, sortiere erst nach dieser weiteren Spalte, dann nach FK. Bei MySQL benötigst Du somit mindestens die Version 4.0.

    Freundliche Grüße

    Vinzenz

  2. Hallo Frank,

    Ich hab folgendes Problem: ich habe eine Tabelle mit einem Fremdschlüssel, der allerdings nicht zwangsläufig belegt ist, z.B.

    dazu schrieb Vinzenz ja bereits, dass hier NULL geeigneter wäre.

    Jetzt will ich die Datensätze aufsteigend nach FK sortieren und es nervt, dass da am Anfang natürlich immer die mit "0" stehen.

    Du hat nicht geschrieben, welches DBMS du verwendest, aber wenn es IF() unterstützt (kann das außer MySQL überhaupt noch ein DBMS?), könntest du sowas verwenden:
    SELECT pk, name, fk, IF(fk=0,2,1) as sort FROM tabelle ORDER BY sort, fk
    In der Spalte sort steht dann bei den Zeilen mit fk=0 eine 2 drin und bei allen anderen eine 1 - durch die Sortierung nach sort werden die unerwünschten Zeilen dann nach unten geschoben.

    Grüße aus Nürnberg
    Tobias

    1. echo $begrüßung;

      Du hat nicht geschrieben, welches DBMS du verwendest, aber wenn es IF() unterstützt (kann das außer MySQL überhaupt noch ein DBMS?), [...]

      Warum nicht? Oracle beispielsweise bietet DECODE() und CASE...WHEN...ELSE und vielleicht auch noch COALESCE() und NULLIF(), siehe http://www.techonthenet.com/oracle/functions/decode.php und http://www.databasejournal.com/features/oracle/article.php/3344871 und folgende Seite

      Und auch PostgreSQL hat da was im Angebot: http://www.postgresql.org/docs/8.1/static/functions-conditional.html

      und SQLite http://www.sqlite.org/lang_expr.html

      und Informix (mindestens CASE...WHEN...ELSE)

      usw. usf.

      echo "$verabschiedung $name";

      1. Hallo dedlfix,

        Du hat nicht geschrieben, welches DBMS du verwendest, aber wenn es IF() unterstützt (kann das außer MySQL überhaupt noch ein DBMS?), [...]
        Warum nicht?

        Ich bin nicht davon ausgegangen, dass kein anderes DBMS sowas kennt - ich wusste nur nicht. Aber danke für die Hinweise - jetzt weiß ich, dass andere DBMS das durchaus können.

        Grüße aus Nürnberg
        Tobias