SQL Split-Function für SAP HANA

Die SQL-Dialekt von SAP HANA bietet leider keine “Split”-Funktion, um Zeichenfolgen anhand eines bestimmten Trennzeichens aufzulösen und weiter zu verarbeiten. Seit dem SPS07 gibt es das Repository Element hdbtablefunctions mit welchem das Feature einer SAP HANA Split Function komfortable umgesetzt werden kann.

Wie legt man eine eigene SAP HANA Split Function mit SQLScript in SAP HANA an?

Dazu müssen Sie im SAP HANA Studio eine Datei mit der Endung .hdbtablefunction anlegen und folgendes Coding einfügen. Die Funktion bietet die Möglichkeit einen String und ein Trennzeichen als Parameter zu übergeben. Als Rückgabe wird eine Tabelle mit einem Counter und dem dazugehörigen gesplitteten String ausgegeben.

FUNCTION "SYSTEM"."folder::fn_split_string" ( IP_STRING NVARCHAR(5000), IP_DELIMITER VARCHAR(1) ) 

    RETURNS TABLE (ID INTEGER, VAL NVARCHAR(1000))
 
    LANGUAGE SQLSCRIPT
    SQL SECURITY INVOKER AS
 
    v_out VARCHAR(100):='';
    v_count INTEGER:=1;
    v_substr VARCHAR(1000):='';
    v_substr2 VARCHAR(1000):='';
    id INTEGER array;
    val VARCHAR(100) array;
 
BEGIN
    v_substr:=:ip_string; 
 
    while(LOCATE (:v_substr, :ip_delimiter) > 0 ) do
 
        -- find value
        v_out := SUBSTR(v_substr, 0, LOCATE (:v_substr, :ip_delimiter) - 1 );
 
        -- out to output
        id[v_count]:=v_count;
        val[v_count]:=v_out;
 
        -- increment counter
        v_count:=:v_count+1;
 
        -- new substring for search
        v_substr2 := SUBSTR(:v_substr, LOCATE (:v_substr, :ip_delimiter) + 1, LENGTH(:v_substr));
        v_substr := v_substr2;
 
    END while;
 
    IF(LOCATE (:v_substr, :ip_delimiter) = 0 AND LENGTH(:v_substr) > 0) THEN
        -- no delimiter in string
        id[v_count]:=v_count;
        val[v_count]:=v_substr;
 
    END IF;
 
    -- format output as tables
    rst = unnest(:ID,:VAL) AS ("ID","VAL");
    RETURN SELECT * FROM :rst;
 
END;

Wie wird die SQL Split Function nun in SAP HANA aufgerufen?

Die Funktion ist dann folgendermaßen über SQL nutzbar. Beispielsweise können so Input Parameter einer Calculation View, die zuerst gesplittet werden müsse, bequem verarbeitet werden.

-- Standard-Aufruf
select distinct id, val from "folder::fn_split_string"('test1;test2;test3;', ';');

-- Möglicher Verarbeitung in einem Calculation View
var_out = select * from "TABLE" where "ATTRIBUTE" IN ( 
            select distinct val from "folder:fn_split_string"( :ip_param, ';') );

Mit SQLScript lässt sich in SAP HANA sehr gut Business Logik performant umsetzen. Ein weiteres Beispiel haben wir im Beitrag zur SAP HANA Passwort-Generierung dargestellt.

Hochgeladenes Bild
Dieser Blog-Beitrag wurde von Daniel Schindler geschrieben. Daniel ist ein Senior Consultant & Entwickler für SAP BI, BI-IP und SAP HANA mit mehr als 8 Jahren an Erfahrung. Er verfügt über tiefgreifende Kenntnisse in der Realisierung von Reporting-Anwendungen im SAP Bereich.

Benötigen Sie Beratungs- oder Entwicklungsunterstützung in Ihrem SAP BW / HANA / SAPUI5 Projekt? Dann zögern Sie nicht und kontaktieren uns unverbindlich unter info@intellify.de.