Snowflake标量UDF返回无法评估不支持的子查询类型

时间:2019-11-14 21:35:17

标签: user-defined-functions snowflake-data-warehouse

我们正在使用JDE作为SOurce和Snowflake作为DW进行DataWarehousing工作。因此,我们需要在当前具有JDE_Julian日期的许多字段中具有正常日期。
当前,如果我们有6个需要在查询中转换的日期,则必须将我们的Date维表绑定6次(Snowflake可以做到这一点),但是我们正在寻找一种更干净的UDF形式的解决方案该函数仅返回给定JDE_Julian_Date的日期。我们已经解决了这个问题,但收到了可怕的“ SQL编译错误:无法评估不支持的子查询类型” 我在这里产生了这个问题。不幸的是,对我来说,它似乎是一个雪花虫。但是我对任何不强迫我对查询表进行6次联接的见解都是开放的。

CREATE OR REPLACE TABLE mydd (day date, JDE_Julian INT);
INSERT INTO mydd
VALUES
('2017-01-01',117001),
('2017-01-02',117002),
('2017-01-03',117003);

CREATE OR REPLACE TABLE mySource (id INT, j1 INT);
INSERT INTO mySource
VALUES
(1,117002),
(2,117002),
(3,117003),
(4,117001);

CREATE OR REPLACE FUNCTION jdetest(julian_date_in int)
  RETURNS date
  VOLATILE
  COMMENT = 'Convert JDE Julian date to regular Date'
  AS
  $$
  SELECT day FROM mydd
      WHERE JDE_Julian = julian_date_in        
  $$;

SELECT jdetest(117001);  --Works
SELECT jdetest(117002);  --Works
SELECT id, jdetest(j1) b1 FROM mysource;  --Fails

2 个答案:

答案 0 :(得分:1)

您的函数必须保证仅返回单个值。如果将其设为聚合或其他形式,则Snowflake将知道仅返回1值,而不是可能的记录集。试试这个,对我有用:

CREATE OR REPLACE FUNCTION jdetest(julian_date_in int)
  RETURNS date
  VOLATILE
  COMMENT = 'Convert JDE Julian date to regular Date'
  AS
  $$
  SELECT max(day) as day FROM mydd
      WHERE JDE_Julian = julian_date_in        
  $$;

答案 1 :(得分:0)

请按如下所示将返回类型更改为表类型,并且应该可以使用。

 RETURNS TABLE(val date)
 VOLATILE
 COMMENT = 'Convert JDE Julian date to regular Date'
 AS
 $$
 SELECT day FROM mydd
     WHERE JDE_Julian = julian_date_in        
 $$;


SELECT s.id, f.val AS b1 FROM mysource s
JOIN TABLE(jdetest( s.j1)) f