是否有人创建了将十进制数作为参数的雪花用户定义函数 (SQL)?

Posted

技术标签:

【中文标题】是否有人创建了将十进制数作为参数的雪花用户定义函数 (SQL)?【英文标题】:Has anybody created a Snowflake User Defined Function (SQL) that takes decimal numbers as arguments? 【发布时间】:2020-01-15 13:54:55 【问题描述】:

我正在尝试创建一个将十进制数作为参数的 SQL UDF,但如果我传入一个小数位数不同的数字,我会收到错误,即使该数字的位数较少小数点右边。

这是一个问题的例子:

CREATE OR REPLACE TABLE EXAMPLE (
    COL1 NUMBER(7,5)
);

INSERT INTO EXAMPLE VALUES (9.12),(10.467),(11.6),(12.01234);

CREATE OR REPLACE FUNCTION LESS_THAN(DATA1 NUMBER(7,5))
  RETURNS TABLE (COL1 NUMBER(7,5))
  as
  $$
    SELECT COL1 FROM EXAMPLE WHERE COL1 < DATA1   
  $$
;

select * from table(LESS_THAN(11.3)); --Error: SQL compilation error: error line 1 at position 20 Invalid argument types for function 'LESS_THAN': (NUMBER(3,1))
select * from table(LESS_THAN(9.85)); --Error: SQL compilation error: error line 1 at position 20 Invalid argument types for function 'LESS_THAN': (NUMBER(3,2))
select * from table(LESS_THAN(10.85001)); --Works

我希望能够创建一个允许接受任何小数的 UDF。

有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

尝试将输入转换为 NUMBER(7,5)。例如:

select * from table(LESS_THAN('11.3'::NUMBER(7,5))); 
select * from table(LESS_THAN( 11.3 ::NUMBER(7,5))); 

你可以使用这个系统函数来观察类型:

select  11.3                x, system$typeof(x); -- NUMBER(3,1)
select  11.30               x, system$typeof(x); -- NUMBER(3,1)
select  11.30 ::NUMBER(7,5) x, system$typeof(x); -- NUMBER(7,5)
select '11.30'::NUMBER(7,5) x, system$typeof(x); -- NUMBER(7,5)

【讨论】:

是的,这确实有效,但确实需要 UDF 的用户知道函数的数字格式。该函数的定义返回LESS_THAN(NUMBER) RETURN TABLE (COL1 NUMBER),因此没有关于数字格式的详细信息。我在想这个选项可能是接受一个字符串并从那里投射它? 好主意 - 可以正常工作。转换为字符串会增加开销,但您可能会发现它可以忽略不计。

以上是关于是否有人创建了将十进制数作为参数的雪花用户定义函数 (SQL)?的主要内容,如果未能解决你的问题,请参考以下文章

两个表作为用户定义函数的参数

如何在 R 中使用颜色十六进制值作为函数参数?

是否可以在用户定义的函数中插入列作为参数?

雪花跟踪器由哪个用户更改

如何将函数与表连接起来,并将表列作为参数传递给雪花中的函数

丢弃用户时出现雪花问题