我有一个要求,我需要将所有SQL Server存储过程转换为HANA存储过程。我在T-SQL中遇到过一个函数ISNUMERIC,我在HANA中没有得到它的等价物。
在搜索网络后,我发现HANA没有内置的ISNUMERIC等效功能。然后我尝试编写自己的函数来实现这一点,并且我坚持使用错误处理和正则表达式限制。
我的HANA版本是70。
答案 0 :(得分:3)
SAP HANA没有ISNUMERIC()
功能。
但是,这个问题已在SCN上被多次询问和回答:
例如。 http://scn.sap.com/thread/3449615
或者我以后的做法: http://scn.sap.com/thread/3638673
drop function isnumeric;
create function isNumeric( IN checkString NVARCHAR(64))
returns isNumeric integer
language SQLSCRIPT as
begin
declare tmp_string nvarchar(64) := :checkString;
declare empty_string nvarchar(1) :='';
/* replace all numbers with the empty string */
tmp_string := replace (:tmp_string, '1', :empty_string);
tmp_string := replace (:tmp_string, '2', :empty_string);
tmp_string := replace (:tmp_string, '3', :empty_string);
tmp_string := replace (:tmp_string, '4', :empty_string);
tmp_string := replace (:tmp_string, '5', :empty_string);
tmp_string := replace (:tmp_string, '6', :empty_string);
tmp_string := replace (:tmp_string, '7', :empty_string);
tmp_string := replace (:tmp_string, '8', :empty_string);
tmp_string := replace (:tmp_string, '9', :empty_string);
tmp_string := replace (:tmp_string, '0', :empty_string);
/*if the remaining string is not empty, it must contain non-number characters */
if length(:tmp_string)>0 then
isNumeric := 0;
else
isNumeric := 1;
end if;
end;
测试显示: 数据为(选择'1blablupp'作为来自虚拟的VAL union all选择'1234'作为来自dummy的VAL union all选择'bla123'作为假的val)
select val, isNumeric(val) from data
VAL ISNUMERIC(VAL)
1blablupp 0
1234 1
bla123 0
答案 1 :(得分:0)
此解决方案应涵盖真正所有可转换为数字的字符串:
PROCEDURE "SCHEMA"."package::IS_NUMERIC" (
in stringToCheck nvarchar(5000)
,out isNumeric integer
)
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
--DEFAULT SCHEMA <default_schema_name>
READS SQL DATA AS
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
isNumeric := 0;
END;
select cast(:stringToCheck as double) from dummy;
isNumeric := 1;
END;
e.g。 还涵盖:call "SCHEMA"."package::IS_NUMERIC"('-12.345', ?)
答案 2 :(得分:0)
从SAP HANA 1.0 SPS12中,您可以在SQL中使用正则表达式。您可以使用LIKE_REGEXPR
函数检查特定字符串是否包含字母,即:
SELECT
CASE WHEN '0001A' LIKE_REGEXPR '[A-Z]' THEN 0 ELSE 1 END
FROM
DUMMY;