hana中的哪个函数和oracle中的lpadyi
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hana中的哪个函数和oracle中的lpadyi相关的知识,希望对你有一定的参考价值。
ceil : 小数不为零部分上取整,即向上取最近的整数select ceil(1.9) from dual; // 结果为2select ceil(1.0) from dual; // 结果为1select ceil(1.01) from dual; // 结果为2floor : 小数部分下取整,即向下取最近的整数select floor(1.9) from dual; // 结果为1select floor(1.0) from dual; // 结果为1select floor(1.01) from dual; // 结果为1 参考技术A 代码如下:和Oracle一样 LPAD/RPAD
SELECT LPAD ('end', 15, '12345') "lpad" FROM DUMMY;--LPAD左填充
SELECT RPAD ('end', 15, '12345') "right padded" FROM DUMMY;
SELECT LPAD ('end', 15, '12345') "lpad" FROM dual;--LPAD左填充
HANA Sqlscript 中的 T-SQL ISNUMERIC 函数等价物是啥?
【中文标题】HANA Sqlscript 中的 T-SQL ISNUMERIC 函数等价物是啥?【英文标题】:What is the equivalent of T-SQL ISNUMERIC function in HANA Sqlscript?HANA Sqlscript 中的 T-SQL ISNUMERIC 函数等价物是什么? 【发布时间】:2014-12-30 10:18:51 【问题描述】:我需要将所有 SQL Server 存储过程转换为 HANA 存储过程。我在 T-SQL 中遇到了 ISNUMERIC 函数,但在 HANA 中没有得到它的等价物。
在网上搜索后发现HANA没有内置ISNUMERIC等效功能。然后我尝试编写自己的函数来实现这一点,但我遇到了错误处理和正则表达式限制。
我的 HANA 版本是 70。
【问题讨论】:
【参考方案1】: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 select '1234' as VAL from dummy union all select 'bla123' as val from dummy)
select val, isNumeric(val) from data
VAL ISNUMERIC(VAL)
1blablupp 0
1234 1
bla123 0
【讨论】:
这不完整:-100、1.000.000 等呢?【参考方案2】:从 SAP HANA 1.0 SPS12 开始,您可以在 SQL 中使用正则表达式。您可以使用LIKE_REGEXPR
函数来检查特定字符串是否包含字母,即:
SELECT
CASE WHEN '0001A' LIKE_REGEXPR '[A-Z]' THEN 0 ELSE 1 END
FROM
DUMMY;
【讨论】:
【参考方案3】:这个解决方案应该真正涵盖所有可转换为数字的字符串:
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;
例如还涵盖:call "SCHEMA"."package::IS_NUMERIC"('-12.345', ?)
【讨论】:
你是对的,这个非常古老的解决方案并没有涵盖大量的案例。部分原因是 SP6/7 中的 HANA 限制。您实际执行转换并报告成功或失败的方法显然是正确的。 但是,通常要求可以更具体(即也像 T-SQL 版本一样忽略逗号、句号和货币符号)。此外,过程的使用(为什么要使用单个标量值的过程?)引入了相当多的开销。或者,可以使用正则表达式进行足够接近的检查:MAP (locate_regexpr(START '[^0-9\-\.\,\+e]' FLAG 'i' in id_char), 0, 1, 0)
。在 10 个 Mio 行上使用它需要 8.5 秒,而在我的测试系统上使用过程/功能需要 19.5 秒。什么是最好的实际上取决于用例。以上是关于hana中的哪个函数和oracle中的lpadyi的主要内容,如果未能解决你的问题,请参考以下文章