有没有办法在使用 CREATE FUNCTION 命令创建用户定义函数时为参数添加默认值?

问题描述 投票:0回答:1

我想创建与以下 Oracle 函数等效的 ClickHouse,如果在函数输入中定义了所需的精度,则生成结果时四舍五入到所需的位数,如果没有则生成不四舍五入的结果。

CREATE OR REPLACE FUNCTION PercentTEST
  (p_divisor IN number, p_denom IN number, p_round IN number default -1, p_zeroreject IN number default null)
  return number
is
 vReject NUMBER;
begin
  if p_denom is NULL then
    return null;
  elsif p_denom = 0 then
    return p_zeroreject;
  end if;
  vReject:=100*p_divisor/p_denom;
  IF p_round <> -1 THEN
    vReject:=round(vReject,p_round);
  END IF;
  return vReject;
end;

我在 ClickHouse 官方文档中找不到与 Oracle 中的 default 关键字等效的任何信息,

CREATE OR REPLACE FUNCTION PercentTEST on cluster 'mycluster' AS (num, denom, precision DEFAULT -1) -> if(isFinite(num / denom), round((100 * num) / denom, precision), NULL)

退货

代码:62. DB::Exception:语法错误:在位置 86 处失败('DEFAULT'):DEFAULT -1) -> if(isFinite(num / denom), round((100 * num) / denom, precision) , 无效的)。预期为以下之一:token、Dot、Comma、ClosingRoundBracket、OR、AND、BETWEEN、NOT BETWEEN、LIKE、ILIKE、NOT LIKE、NOT ILIKE、REGEXP、IN、NOT IN、GLOBAL IN、GLOBAL NOT IN、MOD、DIV、IS NULL、IS NOT NULL、别名、AS。 (语法错误)(版本 23.3.8.21)

ClickHouse 文档明确指出“函数使用的所有变量都必须在其参数列表中指定”。

Oracle 输出是这样的,我想在 ClickHouse 中创建这个结构,

SELECT PercentTEST(3,8) FROM DUAL
返回 0.375 然而
SELECT PercentTEST(3,8,1) FROM DUAL
返回 0.4

我可以使用解决方法吗?

sql database oracle clickhouse olap
1个回答
0
投票

尝试:

CREATE FUNCTION PercentTEST(num Float64, denom Float64, precision Nullable(Int8))
    -> Float64
    -> (
    if(isFinite(num / denom),
       if(isNotNull(precision), round((100 * num) / denom, precision), (100 * num) / denom),
       NULL)
);

示例

没有精度(类似于Oracle中的PercentTEST(3, 8))

SELECT PercentTEST(3, 8, CAST(NULL AS Nullable(Int8))) AS result1

具有精度(类似于 Oracle 中的 PercentTEST(3, 8, 1))

SELECT PercentTEST(3, 8, 1) AS result2

© www.soinside.com 2019 - 2024. All rights reserved.