首页 > 解决方案 > 雪花标量 UDF 返回 无法评估不支持的子查询类型

问题描述

我们正在使用 JDE 作为 SOURce 和 Snowflake 作为 DW 进行数据仓库工作。因此,我们需要在当前具有 JDE_Julian 日期的许多字段中使用正常日期。
目前,如果我们有 6 个日期需要在查询中转换,我们必须绑定到我们的日期维度表 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

标签: user-defined-functionssnowflake-cloud-data-platform

解决方案


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

推荐阅读