Sap HANA中的SUBSTRING_INDEX

时间:2017-04-12 13:44:53

标签: mysql sap hana

我正在将数据库引擎从MySql迁移到Sap Hana。

我发现有点麻烦。我有这样的查询:

Select SUBSTRING_INDEX(id, "-", -2) as prod_ref From products;

我不知道如何“翻译”substring_index,因为id的初始部分有一个可变长度。

感谢。

2 个答案:

答案 0 :(得分:0)

这可以使用正则表达式完成:

 select substr_regexpr( '.*-([^-]*-[^-]*)$' in 'varia-ble---part-part1-part2' group 1) from dummy;
 select substr_regexpr( '.*-([^-]*-[^-]*)$' in 'variable-part-part1-part2' group 1) from dummy;

根据HANA 2.0 SP0文档,您可以使用带有负偏移量的locate(然后使用right()),但这不适用于我的系统(" ...功能不受支持) ...&#34)

如果您定期在大量记录上执行此类查询,我建议您在ETL期间将您感兴趣的部分提取到一个单独的字段中。或者,或者使用"填充单独的字段。一直生成......"。 我不止一次看过它,人们在复杂的SQL查询或复杂的CalcViews中计算这样的字段,然后想知道为什么在选择1亿条记录和过滤计算字段等时表现不好......性能通常没问题当您将中间结果集合聚合到合理的大小,然后应用"昂贵的"功能

答案 1 :(得分:-1)

我认为SAP HANA中没有像SUBSTRING_INDEX这样的直接功能。但是你可以通过创建一个传递输入字符串和分隔符的函数来解决替代问题。

我在SUBSTRING_INDEX中假设-2并提供解决方案

将字符串反转并获取第二个分隔符的位置,在您的情况下,将“ - ”添加到“gotPosition”

现在从字符串的长度中减去“obtainPosition”。

obtainedPosition = LENGTH(id) - obtainedPosition

在内置子字符串函数中使用该值,您可以获取所需的字符串并从函数返回。

SELECT SCHEMA.FN_SUBSTRING_INDEX(id,obtainedPosition) INTO ReturnValue FROM DUMMY;

CREATE FUNCTION FN_SUBSTRING_INDEX
(
  id VARCHAR(500),
  delim VARCHAR(2)
)
RETURNS SplitString VARCHAR(500)
LANGUAGE SQLSCRIPT AS
BEGIN
    DECLARE reversedString VARCHAR(500);
    DECLARE charString VARCHAR(2);
    DECLARE i INT := LENGTH(:id);
    DECLARE len INT := LENGTH(:id);
    DECLARE obtainedPosition INT := 0;
    DECLARE flag INT := 0;        
    reversedString := '';

    --loop to reverse the inputstring
    WHILE :i > 0
    DO
    reversedString = CONCAT(:reversedString, SUBSTRING(:id,:i,1));
    i := :i - 1;
    END WHILE;

    --loop to get the second delimiter position
    i := 1;
    WHILE :i <= :leng
    DO
        charString := '';
        charString := SUBSTRING(:reversedString,i,1);
        IF((:charString = :delim ) AND (:flag < 2)) THEN
            BEGIN
                obtainedPosition := :i;
                flag := :flag + 1;
            END;
        END IF;
        i := :i + 1;
    END WHILE;

    --IF condition to check if at least 2 delimiters are available, else print complete string
    IF(flag = 2) THEN
        obtainedPosition := :len - :obtainedPosition + 2; --2 is added to avoid the character at that position and '-' from printing
    ELSE
        obtainedPosition := 1;
    END IF;

    --SplitString contains the string's splitted return value   
    SELECT SUBSTRING(:id,:obtainedPosition) INTO SplitString FROM DUMMY;
END;

上述功能已从http://www.kodyaz.com/sap-abap/sqlscript-reverse-string-function-in-sap-hana.aspx

修改

对于SAP HANA中的字符串函数,请参阅:http://www.sapstudent.com/hana/sql-string-functions-in-sap-hana/3

您可以在SAP HANA中使用匿名阻止来调用和检查功能

 DO 
 BEGIN
   DECLARE id VARCHAR(500) := 'Test-sam-ple-func';
   DECLARE delim VARCHAR(2) := '-';
   SELECT SCHEMA.FN_SUBSTRING_INDEX(id,delim) AS "SplitStringIndex" FROM DUMMY;
 END;

我很高兴知道一个downvote的原因。 :)