2017-04-12 28 views
0

私は、データベースエンジンをMySqlからSap Hanaに移行しています。Sap HANAのSUBSTRING_INDEX

少し問題が見つかりました。 IDの最初の部分は可変の長さを持っているので、私はSUBSTRING_INDEXを「翻訳」する方法がわからない

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

:私はこのようなクエリを持っています。

ありがとうございました。

+0

何が問題になっていますか? – Rams

答えて

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ドキュメントによると、システム( "...機能はサポートされていません...")

多くのレコードでこのようなクエリを定期的に実行する場合は、ETL中に興味のある部分を別のフィールドに抽出することをお勧めします。または、「GENERATED ALWAYS AS ...」を使用して別のフィールドに入力します。 複雑なSQLクエリや複雑なCalcViewでは、このようなフィールドを計算してから、1億レコードを選択して計算フィールドなどをフィルタリングするときにパフォーマンスが悪いのはなぜかと思います。中間結果セットを合理的なサイズに集約してから "高価な"関数を適用すると問題が発生します。

-1

SAP HANAにSUBSTRING_INDEXのような直接的な機能はありません。しかし、入力文字列と区切り文字を渡す関数を作成することで、別の方法があります。

そして私はSUBSTRING_INDEXで-2ことと

ソリューションを提供することは、文字列を逆にし、2番目の区切り文字の位置を取得

想定しています - 今すぐ引くあなたのケースでは、「obtainedPosition」に

「」文字列の長さから "acquiredPosition"を返します。

obtainedPosition = LENGTH(id) - obtainedPosition 

inbuilt部分文字列関数でその値を使用すると、必要な文字列を取得して関数から返すことができます。

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; 

上記の機能は、SAP HANAでの文字列関数についてhttp://www.kodyaz.com/sap-abap/sqlscript-reverse-string-function-in-sap-hana.aspx

から修正されたが、これを参照: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の理由を知ってうれしいです。 :)