user-defined-functions - 雪花标量 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
解决方案
您的函数必须保证只返回一个值。如果您将其设为聚合或其他内容,则 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
$$;
推荐阅读
- php - 通过 .php 从文件中读取文本并将部分存储在变量中
- css - 如何隐藏特定的类字段?
- javascript - 了解javascript中的onclick方法
- javascript - 如何遍历来自 API 的所有响应并使用 Javascript 将它们传递给 Google Sheet?
- ruby-on-rails - 成功部署后缺少宝石
- mysql - MySQL 批量更改字符串字段,例如:在用户名列的开头添加“x”
- java - 列表中的一种类型的项目
- elasticsearch - ES bool 和 match 什么时候应该使用?
- c# - Unity 3d,什么是 Universe.physicsTimeStep?
- laravel - Vue 中的 Laravel-echo 返回“私有不是函数”