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

我们正在使用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,(2,(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
sunvisual 回答:Snowflake标量UDF返回无法评估不支持的子查询类型

您的函数必须保证仅返回单个值。如果将其设为聚合或其他形式,则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        
  $$;
,

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

 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

本文链接:https://www.f2er.com/3099198.html

大家都在问