Announcement

Collapse
No announcement yet.

Wiederholende Case-Statements auslagern und mehrmalig verwenden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wiederholende Case-Statements auslagern und mehrmalig verwenden

    Hallo zusammen, wie kann man wiederholende (im Select, Group by usw) ellenlange Case-Statements auslagern, benennen und dann mittels dieses Namen mehrmalig verwenden?

  • #2
    Du kannst einfach eine Funktion schreiben, z.B.

    [HIGHLIGHT=sql]
    CREATE OR REPLACE FUNCTION Note2Text(n IN INTEGER) RETURN VARCHAR2 DETERMINISTIC IS
    BEGIN
    CASE n
    WHEN 1 THEN RETURN 'Sehr gut'
    WHEN 2 THEN RETURN 'Gut'
    WHEN 3 THEN RETURN 'Befriedigend'
    WHEN 4 THEN RETURN 'Ausreichend'
    WHEN 5 THEN RETURN 'Mangelhaft'
    WHEN 6 THEN RETURN 'Ungenügend'
    END CASE;

    END Note2Text;
    /

    Select Note2Text(Note) from Zeugnisse;

    [/HIGHLIGHT]

    Comment


    • #3
      Eine andere Möglichkeit ist einfach Verschachtelung der Statements, die Teilelemente sind dann nicht "verschwunden" aber tauchen nur einmal innen auf, werden dort per Alias benannt und können damit später beliebig angesprochen werden, das ist jedenfalls beliebig komplex und dynamisch und ein sehr pragmatischer Ansatz.

      Statt der Wiederholung im Group by bzw Sort (wenn es nicht via Schachtelung abzufackeln ist) kann man für beides (group und Sort) auch die Spaltennummer verwenden. Dabei ist aber Vorsicht geboten, wenn das Statement später erweitert wird, die Nummerierung muss dann vielleicht angepasst werden.
      Wenn mich nicht alles täuscht, habe ich neulich zu meiner Verwunderung auch ein Statement gesehen, wo die Spalte im Group per Spalten-Alias angesprochen wurde. Ich dachte immer das geht nicht, habs aber auch nicht geprüft. Vielleicht auch was neues aus Oracle 11 oder 12?

      Auch schön:
      Views! (oder auch geschachtelte Views) Bieten sowieso viele Vorteile und eben auch den, dass sie komplexen Kram verstecken. Gleiche Prinzip wie bei dem ersten Vorschlag oben mit geschachtelten Select-Statements.
      Einziger Nachteil ist m.E. dass gewisse Felder, die eigentlich nur zur Filterung gebraucht würden (ohne Anzeige/ Ausgabe) im View mit durchgeführt werden müssen. Das kann dann auch nennenswerte Performanceeinbußen mit sich bringen. (Bei geschachteltem Selects habe ich das noch nicht bemerkt) Ansonsten kann man Schnittstellenkonzepte (logische und Berechtigungen), Editierschutz, etc mit im View unterbringen.

      Man erstellt mit ein paar Views eine vereinheitlichte, saubere, Logikschicht inkl Berechtigungsmerkmalen und hat Spaß mit den Daten. Komplexe und häßliche Segmente kann man hier zentral und robust unterbringen, aber nicht um jeden Preis. Man sollte es sinnvoll vereinen.
      Wenn das nicht möglich ist, muss man etwas fleißig sein und außerhalb des Views weiterarbeiten.
      Gruß, defo

      Comment


      • #4
        @Wernfried Hört sich gut an, allerdings habe ich eingeschränkte Berechtigungen und kann keine Funktionen erstellen. Wäre es möglich etwas weniger ausgefallen, wie z.B. das hier unten. Ich kenne allerdings die genaue Syntax nicht und deswegen funktioniert so nicht:
        Code:
        Note2Text =
           CASE n
              WHEN 1 THEN 'Sehr gut'
              WHEN 2 THEN 'Gut'
              WHEN 3 THEN 'Befriedigend'
              WHEN 4 THEN 'Ausreichend'
              WHEN 5 THEN 'Mangelhaft'
              WHEN 6 THEN 'Ungenügend'
           END ;
        /
         
        SELECT Note2Text FROM Zeugnisse;

        Comment


        • #5
          Du könntest auch eine 2. Tabelle anlegen und auf diese einen Join machen. Das ist ja doch eher ein Lookup als ein Case Statement.

          Comment


          • #6
            Eure Hilfe war Hilfe zur Selbshilfe und auf keinen Fall umsonst: Ich habe das gefunden: http://oraculix.wordpress.com/2009/1...r-with-clause/. Fantastisch, genau das Richtige für mich!

            Comment

            Working...
            X