In diesem Artikel lernen Sie, wie Sie IF ELSE Konstrukte in Ihrer SQLScript Transformationsroutine umsetzen können. Denn eigentlich sind in SQL SELECT Statements keine IF ELSE Anweisungen vorgesehen. Allerdings können Sie auch eine native SQL Anweisung nutzen, um dasselbe Ziel zu erreichen. Wir zeigen Ihnen, wie es geht.
So können Sie die native CASE WHEN Anweisung nutzen, um die IF - THEN - ELSE Logik in Ihren SQL Statements abzubilden. Nachfolgend stelle ich diese im Detail vor. Anschließend illustriere ich die Funktionsweise anhand eines praktischen Beispiels.
Die Syntax der CASE WHEN Anweisung lautet wie folgt.
CASE
WHEN Bedingung1 THEN Ergebnis1
WHEN Bedingung2 THEN Ergebnis2
WHEN BedingungN THEN ErgebnisN
ELSE Ergebnis
END;
Bei den Bedingungen können Sie die folgenden Vergleichsoperatoren verwenden:
Operator |
Beschreibung |
= |
Gleich |
> |
Größer als |
< |
Kleiner als |
>= |
Größer / gleich |
<= |
Kleiner / gleich |
!=, <> |
Ungleich |
Darüber hinaus können Sie die logischen Operatoren OR, AND sowie NOT verwenden.
<Bedingung> ::= <Bedingung> OR <Bedingung> | <Bedingung> AND <Bedingung>
| NOT <Bedingung> | ( <Bedingung> ) |
Wenn Sie mehrere Operatoren verwenden, werden diese in einer bestimmten Reihenfolge ausgeführt. Zuerst werden die Vergleichsoperatoren wie = oder > ausgewertet. Anschließend werden die logischen Operatoren ausgewertet. Dabei hat der NOT-Operator Vorrang gegenüber AND und OR. Der OR Operator hat die niedrigste Priorität. Sie können diese Reihenfolge übersteuern, indem Sie Klammern verwenden. Bedingungen in Klammern werden immer zuerst ausgewertet.
Die CASE Anweisung funktioniert ähnlich wie eine IF-THEN-ELSE-Anweisung. Das System durchläuft die Bedingungen und gibt einen Wert zurück, wenn die erste Bedingung erfüllt ist. Sobald eine Bedingung erfüllt ist, hört der Vorgang auf und das Ergebnis wird zurückgegeben. Wenn keine Bedingungen erfüllt sind, wird der Wert in der ELSE-Klausel zurückgegeben. Falls kein ELSE-Teil definiert wurde und keine Bedingungen erfüllt sind, wird NULL zurückgegeben.
In Zusammenhang mit SAP HANA ist der folgende Sachverhalt interessant. Da die Datenbank zur Verbesserung der Performance einige Abkürzungen nimmt, kann nicht garantiert werden, ob alle WHEN-Klauseln ausgewertet werden.
Betrachten wir das folgende Beispiel, wobei b für Bedingung und e für Ergebnis steht.
CASE
WHEN b1 THEN e1
WHEN b2 THEN e2
ELSE e3
END
In einer HANA Datenbank können b1, e1, b2, e2 und e3 in beliebiger Reihenfolge ausgewertet werden. Nehmen wir an, dass b1 immer TRUE zurückgeben würde und e2 immer eine Ausnahme auslöst.
Wenn b1 zuerst überprüft wird und TRUE zurückgibt, wird e1 ausgewertet und als Ergebnis des CASE-Ausdrucks zurückgegeben. Die restlichen Anweisungen werden nie durchlaufen, sodass e2 keine Ausnahme auslösen würde. Falls jedoch e2 zuerst ausgewertet wird, wird eine Ausnahme ausgelöst. Daher können die restlichen Bedingungen nicht mehr überprüft werden.
Zum besseren Verständnis möchte ich ein praktisches Beispiel anbringen. Dabei sollen die Kunden anhand des Vermögens segmentiert werden.
Uns stehen folgende Ausgangsdaten zur Verfügung:
Kunde |
Vermögen |
Währung |
1000 |
100.000.000 |
EUR |
2000 |
50.000.000 |
EUR |
3000 |
30.000.000 |
EUR |
4000 |
5.000.000 |
EUR |
5000 |
4.999.999 |
EUR |
6000 |
2.000.000 |
EUR |
7000 |
1.000.000 |
EUR |
8000 |
500.000 |
EUR |
Als Ergebnis würden wir folgende Segmentierung erwarten:
Kunde |
Vermögen |
Währung |
Kategorie |
1000 |
100.000.000 |
EUR |
A |
2000 |
50.000.000 |
EUR |
B |
3000 |
30.000.000 |
EUR |
B |
4000 |
5.000.000 |
EUR |
B |
5000 |
4.999.999 |
EUR |
C |
6000 |
2.000.000 |
EUR |
C |
7000 |
1.000.000 |
EUR |
C |
8000 |
500.000 |
EUR |
D |
Die Segmentierung wird mithilfe der CASE WHEN Anweisung vorgenommen:
METHOD PROCEDURE BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY.
OUTTAB = SELECT "/BIC/ZDRCLNT",
CASE
WHEN AMOUNT > 50000000 THEN 'A' --Ultra High Net Worth
WHEN AMOUNT BETWEEN 5000000 AND 50000000 THEN 'B' --Very High Net Worth
WHEN AMOUNT BETWEEN 1000000 AND 4999999 THEN 'C' --High Net Worth
ELSE 'D' --Affluent
END AS "/BIC/ZDRCAT",
CURRENCY, RECORDMODE, AMOUNT, RECORD, SQL__PROCEDURE__SOURCE__RECORD
FROM :INTAB;
ERRORTAB = SELECT '' AS ERROR_TEXT, '' AS SQL__PROCEDURE__SOURCE__RECORD FROM DUMMY WHERE DUMMY <> 'X';
ENDMETHOD.
Das führt zum folgenden Ergebnis:
Die Kundensegmentierung kann anschließend in einer Query ausgewertet werden:
Obwohl im nativen SQL keine IF Anweisungen vorgesehen sind, können Sie das gewünschte Ergebnis mit CASE WHEN erreichen. Beachten Sie jedoch bitte, dass die Reihenfolge in der die Bedingungen geprüft werden, zufällig ist. Daher sollten Sie immer Bedingungen definieren, die sich gegenseitig ausschließen und das Ergebnis immer eindeutig ist. Ich hoffe, dass Ihnen dieser Beitrag geholfen hat.
Planen Sie einen Umstieg auf SQLScript und benötigen Sie Unterstützung bei der Planung der richtigen Strategie? Oder benötigen Sie erfahrene Entwickler zur Umsetzung Ihrer Anforderungen? Zögern Sie bitte nicht, uns zu kontaktieren - wir beraten Sie gerne.