Newbie braucht Hilfe beim Verstehen

Hallo,

ich muss für einen kranken Kollegen ein Skript ändern, dessen SQL Aufruf nicht verstehe.
Das letzte mal, dass ich SQL genutzt habe dürfte um 2003 gewesen sein, wo ich recht simple Aufrufe genutzt habe (Select, Update, Insert)

Eingebettet ist das ganze in ein Shellskript (Bash). Meine Unix Tage sind auch schon etwas her, aber grundsätzliche verstehe ich was das Skript selber macht.

An dem SQL Teil beiße ich mir aber jetzt schon seit 2 Tagen die Zähne aus. Es werden eine Menge Befehle genutzt, die ich einzeln verstehe, wie z.B. Concat, aber in seiner Zusammensetzung verstehe ich es nicht.

echo "column TREFFER  format A1000" >> $SQL_SCRIPT

   echo "select " >> $SQL_SCRIPT

   echo "WMSYS.WM_CONCAT(distinct 'TREFFER='||wf.SUBMIT_DATE||'|'||wf.form_id||'|'||wf.SITEKEY)||'|'||" >> $SQL_SCRIPT
   echo "WMSYS.WM_CONCAT(CASE WHEN PKEY='gender'  THEN  PVALUE END)||'|'||" >> $SQL_SCRIPT
   echo "WMSYS.WM_CONCAT(CASE WHEN PKEY='givenname'  THEN  PVALUE END)||'|'||" >> $SQL_SCRIPT       

echo “WMSYS.WM_CONCAT(CASE WHEN PKEY=‘surname’ THEN PVALUE END)||’|’||” >> $SQL_SCRIPT
echo “WMSYS.WM_CONCAT(CASE WHEN PKEY=‘email’ THEN PVALUE END)||’|’||” >> $SQL_SCRIPT
echo “WMSYS.WM_CONCAT(CASE WHEN PKEY=‘customercode’ THEN PVALUE END)||’|’||” >> $SQL_SCRIPT
echo “WMSYS.WM_CONCAT(CASE WHEN PKEY=‘company_ku’ THEN PVALUE END)||’|’||” >> $SQL_SCRIPT
echo “WMSYS.WM_CONCAT(CASE WHEN PKEY=‘reference_number’ THEN PVALUE END)||’|’||” >> $SQL_SCRIPT
echo “WMSYS.WM_CONCAT(CASE WHEN PKEY=‘training_id’ THEN PVALUE END)||’|’||” >> $SQL_SCRIPT
echo “WMSYS.WM_CONCAT(CASE WHEN PKEY=‘seminar_title’ THEN PVALUE END)||’|’||” >> $SQL_SCRIPT
echo “WMSYS.WM_CONCAT(CASE WHEN PKEY=‘seminar_place’ THEN PVALUE END)||’|’||” >> $SQL_SCRIPT
echo “WMSYS.WM_CONCAT(CASE WHEN PKEY=‘datum_start’ THEN PVALUE END)||’|’||” >> $SQL_SCRIPT
echo “WMSYS.WM_CONCAT(CASE WHEN PKEY=‘datum_end’ THEN PVALUE END)||’|’||” >> $SQL_SCRIPT
echo “WMSYS.WM_CONCAT(CASE WHEN PKEY=‘targetGroup’ THEN PVALUE END)||’|’||” >> $SQL_SCRIPT
echo "WMSYS.WM_CONCAT(CASE WHEN PKEY=‘contentUri’ THEN PVALUE END)||’|’ as TREFFER " >> $SQL_SCRIPT

   echo "from m_webform_data wfd1 " >> $SQL_SCRIPT
   echo "JOIN M_WEBFORM wf ON wfd1.form_id = wf.form_id" >> $SQL_SCRIPT
   echo "AND wf.NAME = 'CM9_training_registration_WSD'" >> $SQL_SCRIPT
   echo "group by wfd1.FORM_ID order by  wfd1.FORM_ID;" >> $SQL_SCRIPT

Ich habe versucht die einzelnen Teile in ein SQL Statement umzuwandeln um mehr durchblick zu bekommen, bin aber völlig überfordert und finde keinen Punkt wo ich ansetzten kann.
Um ehrlich zu sein, weiß ich nicht mal wie ich erklären kann woran ich scheitere… :unamused:

Mit den besten Grüßen,
Andrés

Was steht denn in der Datei, die in $SQL_SCRIPT hinterlegt ist?
Da sollte das generierte SQL drin sein.

Gruß UWe

ich bekomme sowas in der Richtung:

column TREFFER  format A1000
select 
WMSYS.WM_CONCAT(distinct 'TREFFER='||wf.SUBMIT_DATE||'|'||wf.form_id||'|'||wf.SITEKEY)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='gender'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='givenname'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘surname’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘email’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘customercode’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘company_ku’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘reference_number’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘training_id’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘seminar_title’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘seminar_place’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘datum_start’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘datum_end’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘targetGroup’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘contentUri’ THEN PVALUE END)||’|’ as TREFFER 
from m_webform_data wfd1 
JOIN M_WEBFORM wf ON wfd1.form_id = wf.form_id
AND wf.NAME = 'CM9_training_registration_WSD'
group by wfd1.FORM_ID order by  wfd1.FORM_ID;

das ist sicherlich nicht ganz korrekt, aber man kann erahnen, daß da eine simple Abfrage über 2 Tabellen (m_webform_data und M_WEBFORM) zusammengefrickelt wird.

Allerdings finde ich WMSYS und WM_CONCAT im Zusammenhang mit Oraggle.

column TREFFER  format A1000
select
WMSYS.WM_CONCAT(distinct 'TREFFER='||wf.SUBMIT_DATE||'|'||wf.form_id||'|'||wf.SITEKEY)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='gender'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='form_country'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='form_language'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='camp'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='givenname'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='surname'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='company'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='street'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='housenr'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='postalcode'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='city'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='country'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='contact'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='email'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='phone'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='mail-when'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='phone-when'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='phone_mail_post_contact_allowed'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='help'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='materials'  THEN  PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='message' THEN replace(replace(PVALUE,CHR(13),''),CHR(10),' ') END)||'|' as TREFFER
from m_webform_data wfd1
JOIN M_WEBFORM wf ON wfd1.form_id = wf.form_id
AND wf.NAME = 'form_de_de_sliding_systems_morethanaview_contact_consultation'
group by wfd1.FORM_ID order by  wfd1.FORM_ID;

Ich denke eines meiner größeren Probleme ist, dass ich nicht verstehe was der Concat Befehl an der Stelle (mit dem Case) genau macht, oder was das Ergebnis sein sollte.
Wenn ich auf “select CONCAT(CASE WHEN PKEY='gender' THEN PVALUE END) from m_webform_data;” verkürze bekomme ich einen Fehler.

Was WMSYS.WM vor dem Concat macht erschließt sich mir nicht und ich habe auf keiner Webseite eine Idee gefunden.

Das ist eine Abfrage für Oracle, nicht für Postgres.
Willst Du die so umschreiben, dass sie mit Postgres läuft?

Was WMSYS.WM vor dem Concat macht erschließt sich mir nicht

Das macht “vor dem” gar nichts.

Der Ausdruck WMSYS.WM_CONCAT() ruft die Funktion wm_concat() des Users WMSYS auf.

Das ist eine undokumentierte Funktion von Oracle und entspricht dem string_agg() in Postgres - eine Aggregation die Strings verkettet.

D.h.

WMSYS.WM_CONCAT(CASE WHEN PKEY='gender' THEN PVALUE END) kann man in Postgres durch string_agg(CASE WHEN PKEY='gender' THEN PVALUE END, ',') ersetzen.

Wenn ich das richtig sehe, kann man das in Postgres so schreiben:

concat_ws('|', 
          string_agg(distinct 'TREFFER='||wf.SUBMIT_DATE||'|'||wf.form_id||'|'||wf.SITEKEY, ','),
          string_agg(CASE WHEN PKEY='gender'  THEN  PVALUE END, ','), 
          string_agg(CASE WHEN PKEY='form_country'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='form_language'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='camp'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='givenname'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='surname'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='company'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='street'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='housenr'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='postalcode'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='city'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='country'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='contact'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='email'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='phone'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='mail-when'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='phone-when'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='phone_mail_post_contact_allowed'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='help'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='materials'  THEN  PVALUE END, ','),
          string_agg(CASE WHEN PKEY='message' THEN replace(replace(PVALUE,CHR(13),''),CHR(10),' ') END)
         )

Hallo Castorp,

ich habe mich erst einmal damit auseinander gesetzt die Syntax des derzeitigen Aufrufes zu verstehen, da ich keine Datenbank Admin bin und wenig direkte Berührung habe.

Mittlerweile habe ich die Syntax so weit verstanden, auch wenn ich sie nicht selber von Scratch bauen könnte.

Zum Thema Postgres: Postgres ist doch eine Datenbank, oder? Zumindest suggeriert mir das eine Suche im Internet. Ich bin aber leider an Oracle gebunden.
Oder kann ich den Aufruf auch bei Oralce nutzen?

Viele Grüße!

Klar ist es das. Allerdings hat jede Datenbank ihren eigenen SQL Dialekt der zum Teil stark vom SQL Standard abweicht. Eine Abfrage die in System X läuft muss nicht notwendigerweise in System Y genauso laufen.

Wie Du an meinem Beispiel sehen kannst, ist die Postgres Syntax sehr unterschiedlich.

Wenn Du konkrete Hilfe zu Oracle suchst, dann bist Du hier leider an der falschen Stelle (wir helfen aber gerne bei Problemen mit der Migration von Oracle nach Postgres)

1 „Gefällt mir“

Hallo Castorp,

selbst wenn ihr Oracle nicht wirklich nutzt, habt ihr ihr dennoch enorm weitergeholfen.
Ein Umstieg ist, derzeit, leider nicht geplant.

Beste Grüße,
Andrés