Troll19: SQL: Attribute innerhalb einer Zeile sortieren

Hallo, zunächst folgendes: Aus einem anderen Beitrag weiß ich, dass mein Text vermutlich ziemlich chaotisch aussieht. Das liegt daran, dass ich blind bin und mein Screenreader verrät mir leider nicht viel über die optische Darstellung. Vielleicht ist jemand so nett und formatiert die Geschichte ein bisschen? Vielen Dank.

beim Auslesen einiger Attribute aus einer Oracle-Datenbank ist von folgenden Voraussetzungen auszugehen: Es werden der Name und Vorname einer Person und die Namen seiner Haustiere ausgelesen und in einer Zeile ausgegeben. Die Person besitzt mindestens ein Haustier. Es können aber auch zwei sein. Die Namen der Haustiere sollen sortiert ausgegeben werden. Die Namen der Haustiere sollen bewusst nicht in eine eigene Tabelle ausgelagert werden. Mein Statement sieht dann folgendermaßen aus:

select t.name || '|' || t.vorname || '|' || 

       case 

       when t.tier2 is null or t.tier1 < t.tier2 then t.tier1 || '|' || t.tier2 || '|' 
       
       else t.tier2 || '|' || t.tier1 || '|' 

       end 

 from  tabelle t 

Gibt es eine vernünftige Lösung bei drei oder vier Tiernamen, ohne diese in eine eigene Tabelle auszulagern? Mit when wird es da wohl ziemlich komisch. Die Lösung sollte auch dann noch funktionieren, wenn es gar kein Haustier gibt. In der Ausgabe sollen alle Attribute mit ihrem Trennstrich auftauchen, also im Zweifelsfall "||||". Attribute mit dem Wert null sollen am Ende stehen.

Schönen Gruß Troll19

  1. Tach!

    Die Namen der Haustiere sollen bewusst nicht in eine eigene Tabelle ausgelagert werden.

    Vor allem, wenn es erweiterbar sein soll, ist das keine gute Vorgehensweise. Eines der Probleme hast du ja schon kennengelernt.

    Gibt es eine vernünftige Lösung bei drei oder vier Tiernamen, ohne diese in eine eigene Tabelle auszulagern?

    Mir ist keine bekannt. Datenbanksysteme sind so ausgelegt, mit Datensätzen zu arbeiten, nicht mit Feldern, wenn es sich um gleichartige Daten handelt.

    Mit when wird es da wohl ziemlich komisch. Die Lösung sollte auch dann noch funktionieren, wenn es gar kein Haustier gibt. In der Ausgabe sollen alle Attribute mit ihrem Trennstrich auftauchen, also im Zweifelsfall "||||". Attribute mit dem Wert null sollen am Ende stehen.

    Mit extra Tabelle würde man die Tiere joinen und über GROUP BY per Person zusammenfassen. MySQL kennt dafür die Funktion GROUP_CONCAT(). Oracle kenne ich nicht weiter, aber da sagt mir eine Suche, dass das Äquivalent dazu LISTAGG() lautet.

    dedlfix.

    1. Hallo dedlfix, ich versuche gerade, mich in SQL einzuarbeiten. Demnächst werde ich es mit einer Datenbanktabelle zu tun bekommen, bei der es nun mal so ist. Da habe ich keinen Einfluss. Gruß Troll19

  2. Hallo Troll19,

    deinen Beitrag konnte ich retten, aber ein schlechtes DB Design lässt sich meistens nicht mehr mit SQL retten. Zwischen Person und Tier besteht eine 1:N Beziehung, die dampft man nicht in eine Row ein.

    PLSQL hat zwar etliche Sonderlocken, von denen MYSQL oder MS SQL Anwender nichts wissen, aber ein schneller Überflug über die Oracle Doku hat mir jetzt nichts gezeigt, womit man X Werte in eine sortierbare Collection umwandeln könnte.

    Möglicherweise könnte ein Oracle-Experte das Problem mit eine benutzerdefinierten Funktion lösen.

    Es gibt aber noch eine ganz andere Überlegung: Was Du da tust, ist eine Aufgabe der Präsentationsschicht, nicht der Datenhaltung. Es sollte also auch in der Präsentationsschicht programmiert werden. Sprich: In der Anwendung, die die Datenbank nutzt.

    Rolf

    --
    sumpsi - posui - clusi