Ankündigung

Einklappen
Keine Ankündigung bisher.

Order by case asc

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Order by case asc

    Hallo zusammen. Ich habe folgendes Problem. Ich möchte aus einer DB die Namen nach einer gewissen Ordnung sortieren.
    Alle die mit Meier heissen möchte ich am Schluss haben (das funktioniert auch).
    Alle die mit H beginnen möchte ich zuerst haben (funktioniert auch), nun möchte ich aber alle Namen mit H noch alphabetisch sortieren. Alle meine Versuche scheiterten aber an der Syntax. Kann mir jemand helfen?
    Herzlichen Dank!

    PHP-Code:
    ORDER BY
        
    CASE WHEN name="Meier" then 3
            WHEN 
    (LEFT(name,1)="H"then 1
            WHEN 
    (LEFT(name,1)="F"then 2
                END
            
    '; 

  • #2
    Code:
    test=*# select * from wonder ;
        name    
    ------------
     Meier
     Hubert3
     Hubert1
     Friederich
     Mustermann
     Sorglos
     Bubi
     Hubert2
    (8 Zeilen)
    
    test=*# select name from wonder order by case when name = 'Meier' then 3 when substr(name,1,1) = 'H' then 1 else 2 end, name;
        name    
    ------------
     Hubert1
     Hubert2
     Hubert3
     Bubi
     Friederich
     Mustermann
     Sorglos
     Meier
    (8 Zeilen)
    
    test=*#
    PS.: mit PostgreSQL gemacht. Möglicherweise kann das aber sogar auch MySQL. Vielleicht sogar in derselben Syntax.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Danke. Das name ASC am Schluss hat funktioniert.

      PHP-Code:
      ORDER BY
          
      CASE WHEN name="Meier" then 3
              WHEN 
      (LEFT(name,1)="H"then 1
              WHEN 
      (LEFT(name,1)="F"then 2
                  END
      ,
      name ASC
              
      '; 
      Aber was muss ich machen, wenn ich nun innerhalb von H auch noch spezielle Bedingungen habe? Also Hammer, Huber, Herren, Horn, Hrink. Ich müsste also im WHEN (LEFT(name,1)="H") then 1 - drin Huber und Herren vertauschen.
      Weiss jemand wie man das machen kann?

      Kommentar


      • #4
        Ganz einfach: statt wie jetzt nach 2 Spalten zu sortieren (die erste mittels dem CASE erstellt, die zweitename ASC) erstellst Du nun eine weitere Spalte via CASE. Das kannst Du solange machen, bis es Dir um die Ohren fliegt.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Nein Andreas, er sollte bei dem Schema bleiben denke ich und nur seine CASE-Bedingungen verfeinern.
          So hat wonder hat auch die Funktionsweise noch nicht ganz verstanden.
          Für eine saubere Lösung gehört auch ein ELSE in den CASE.
          Mal ein Beispiel für eine Sortierung von Filmfiguren was ich grad zur Hand hatte.
          Die fiktive Aufgabe:
          1. Namen die mit "Urme" anfangen sollen ganz nach vorn
          2. Namen die mit "B" anfangen danach
          3. Namen die mit "Bibi" anfangen ganz nach hinten
          4. Der Rest mittendrin.

          Code:
          SELECT 
            id, name
          FROM 
            filmfiguren
          ORDER BY
            CASE WHEN LEFT(name,4) = "Urme" then 1
                 WHEN (LEFT(name,4) = "Bibi") then 4
                 WHEN (LEFT(name,1) = "B") then 2
                 ELSE 3
            END, 
            name
          Das Ergebnis:
          "id" "name"
          ---------------------------
          "6" "Urmel aus dem Eis"
          "1" "Bibo"
          "4" "Biene Maja"
          "2" "Alf"
          "3" "Peter Pan"
          "5" "Bibi Blocksberg"

          Wichtig ist auch auf die Reihenfolge der WHEN-Bedingungen innerhalb von CASE zu achten. So muss im Beispiel hier "Bibi" unbedingt vor der Bedingung mit "B" stehen.

          LG jspit

          Kommentar


          • #6
            Danke, in genau das suchte ich! Danke für die Hilfe!

            Kommentar

            Lädt...
            X