mysql HANA中的子字符串索引

osh3o9ms  于 2023-02-11  发布在  Mysql
关注(0)|答案(2)|浏览(181)

我正在将应用程序的数据库引擎从MySql迁移到SAP HANA。
我发现了一点小麻烦。我有一个查询是这样的:

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

我不知道如何"翻译"函数substring_index,因为id的初始部分具有可变长度。
谢谢。

4dc9hkyq

4dc9hkyq1#

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

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()),但这在我的系统上不起作用(“......不支持该功能......”)
如果你定期对大量记录执行这样的查询,我建议你在ETL过程中将你感兴趣的部分提取到一个单独的字段中。或者,使用“始终生成为..."填充一个单独的字段。我不止一次看到过,人们在复杂的SQL查询或复杂的CalcView中计算这样的字段,然后想知道为什么在选择1亿条记录并对计算字段进行筛选等操作时性能会很差......当您将中间结果集聚合到一个合理的大小,然后应用“昂贵”的函数时,性能通常不会有问题。

8mmmxcuj

8mmmxcuj2#

我不认为SAP HANA中有任何像SUBSTRING_INDEX这样的直接函数,但您可以创建一个函数来传递输入字符串和分隔符。
我在SUBSTRING_INDEX中假设并提供解决方案
反转字符串,并将第二个分隔符(在本例中为“-”)的位置设置为“obtainedPosition”
现在从字符串的长度中减去“obtainedPosition”。

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;

我很高兴知道投反对票的理由

相关问题