0

我正在尝试编写一个带有少量复杂 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

4

2 回答 2

0

“厨房水槽”功能:

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
于 2021-07-07T16:45:52.193 回答
0

@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
于 2021-07-08T07:07:41.310 回答