私は、データベースエンジンをMySqlからSap Hanaに移行しています。Sap HANAのSUBSTRING_INDEX
少し問題が見つかりました。 IDの最初の部分は可変の長さを持っているので、私はSUBSTRING_INDEXを「翻訳」する方法がわからない
Select SUBSTRING_INDEX(id, "-", -2) as prod_ref From products;
:私はこのようなクエリを持っています。
ありがとうございました。
私は、データベースエンジンをMySqlからSap Hanaに移行しています。Sap HANAのSUBSTRING_INDEX
少し問題が見つかりました。 IDの最初の部分は可変の長さを持っているので、私はSUBSTRING_INDEXを「翻訳」する方法がわからない
Select SUBSTRING_INDEX(id, "-", -2) as prod_ref From products;
:私はこのようなクエリを持っています。
ありがとうございました。
これは正規表現を使用して行うことができます。
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億レコードを選択して計算フィールドなどをフィルタリングするときにパフォーマンスが悪いのはなぜかと思います。中間結果セットを合理的なサイズに集約してから "高価な"関数を適用すると問題が発生します。
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の理由を知ってうれしいです。 :)
何が問題になっていますか? – Rams