Snowflake Javascript UDTF 中的动态 where 子句
Posted
技术标签:
【中文标题】Snowflake Javascript UDTF 中的动态 where 子句【英文标题】:Dynamic where clause in Snowflake Javascript UDTF 【发布时间】:2021-07-07 12:20:23 【问题描述】:我正在尝试编写一个带有少量复杂 SQL 查询的 UDTF,但由于我不懂 javascript,所以无法这样做。
我正在复制我需要帮助的案例。有人可以为此编写一个 UDTF,我可以参考我的用例吗?
create table emp(
empno number(4,0),
ename varchar(10),
job varchar2(9),
mgr number(4,0),
hiredate date,
sal number(7,2),
comm number(7,2),
deptname varchar(20)
);
我想在 UDTF 中放入下面的 sql 查询。 UDTF 将有两个参数“hiredate”和“deptname”。我想在查询中使 where 子句动态化,这意味着用户可以传递hiredate 或deptname 或两者。返回的输出应该是表格。以下示例适用于 SQL UDTF,但我相信我的要求可以通过 Javascript UDTF 来满足
CREATE OR REPLACE SECURE FUNCTION FN_EMP (PARAM_HIREDATE DATE, PARAM_DEPTNAME VARCHAR(20))
RETURNS TABLE (EMPNO NUMBER, ENAME VARCHAR(10))
AS
$$
select EMPNO, ENAME
from emp
where hiredate = PARAM_HIREDATE --these where clause should be applied dynamically
and deptname = PARAM_DEPTNAME
$$
;
请告诉我如何在 JavaScript UDTF(不是 UDF)中使用 If else。或者启发我如何满足我的要求。有人可以为此编写一个 UDTF,我可以参考我的用例吗?
我已经阅读了 3 个回调函数文档,但不知道如何在 Javascript UDTF 中执行 SQL 语句。
我的要求与此有些相似,但不知道如何在 Javascript UDTF 中执行 SQL。 https://community.snowflake.com/s/question/0D50Z00009Fye3YSAR/have-you-got-an-example-of-a-udf-in-javascript-that-returns-a-table
【问题讨论】:
【参考方案1】:@Lukasz Szozda 我相信如果无法在 SQL UDTF 的输入参数中传递 NULL,那么下面的方法将起作用。但是当用户不想传递任何参数时,我将不得不要求用户将其默认为“NA”。
CREATE OR REPLACE FUNCTION FN_EMP (PARAM_HIREDATE VARCHAR(50),
PARAM_DEPTNAME VARCHAR(20))
RETURNS TABLE (EMPNO NUMBER, ENAME VARCHAR(10))
AS
$$
select EMPNO, ENAME
from emp
where (hiredate = TO_DATE(PARAM_HIREDATE) OR PARAM_HIREDATE = 'NA')
and (deptname = PARAM_DEPTNAME OR PARAM_DEPTNAME = 'NA')
$$
;
SELECT * FROM TABLE(FN_EMP('NA','NA')); -- no params
SELECT * FROM TABLE(FN_EMP('NA','<deparment>')); -- only deparment
SELECT * FROM TABLE(FN_EMP('2021-07-08', '<deparment>')); -- both
【讨论】:
【参考方案2】:“厨房水槽”功能:
CREATE OR REPLACE SECURE FUNCTION FN_EMP (PARAM_HIREDATE DATE,
PARAM_DEPTNAME VARCHAR(20))
RETURNS TABLE (EMPNO NUMBER, ENAME VARCHAR(10))
AS
$$
select EMPNO, ENAME
from emp
where (hiredate = PARAM_HIREDATE OR PARAM_HIREDATE IS NULL)
and (deptname = PARAM_DEPTNAME OR PARAM_DEPTNAME IS NULL)
$$
;
呼叫:
SELECT * FROM TABLE(FN_EMP(NULL::DATE,NULL::STIRNG)); -- no params
SELECT * FROM TABLE(FN_EMP(NULL::DATE,'<deparment>')); -- only deparment
SELECT * FROM TABLE(FN_EMP(CURRENT_DATE, '<deparment>') -- both
【讨论】:
感谢您的回复。我试过了,但它不允许我在输入参数中传递 NULL。抛出错误“SQL 编译错误:在位置 20 处的错误行 1 函数 'FN_EMP' 的参数类型无效:(NULL,NULL)”您能否为此推荐另一种解决方法?或者我们可以使用 JavaScript 做到这一点吗? PS - 我已经尝试在定义 UDTF 时添加可选参数“CALLED ON NULL INPUT”,但这也不起作用。 @pratyushkumar " SELECT * FROM TABLE(FN_EMP(NULL::DATE,NULL::STIRNG));"以上是关于Snowflake Javascript UDTF 中的动态 where 子句的主要内容,如果未能解决你的问题,请参考以下文章
如何克服 Snowflake SQL UDTF 相关子查询错误?
Snowflake 存储过程中的最大 JavaScript 字符串大小
在没有 JavaScript 的情况下将 Oracle PL/SQL 移植到 Snowflake
Snowflake JavaScript程序如何从不在阶段的对象中更新字段?
JavaScript 内存不足错误:超出 UDF 线程内存限制-Snowflake
Snowflake 过程 JavaScript 编译错误:Uncaught SyntaxError: Unexpected token ':' in ERR_LOGGING at