问题描述
我正在尝试使用一个函数在我的表上创建一个虚拟列。该函数可以自行正确执行,但是当我添加到我的表中时:
SELECT *,table_a.function FROM table_a;
示例函数:
CREATE FUNCTION overnight(table_a)
RETURNS boolean AS
$$
SELECT CASE WHEN (((duration / 60) * 100) + (duration % 60) + departure) >= 2400 THEN TRUE ELSE FALSE END FROM schema.table_a
$$;
如何确保代码对表格的每一行都执行?
谢谢!
解决方法
让您的函数接受您需要的字段,而不是整个表格。
SELECT *,overnight(duration,departure) FROM table_a;
CREATE FUNCTION overnight(duration,departure)
RETURNS boolean AS
SELECT CASE WHEN ... THEN TRUE ELSE FALSE END;
$$;
,
您需要在选择中引用参数并去掉 FROM
子句(它从 table 中选择,而不是从行参数中选择)。
为了避免表名和参数之间的混淆,我强烈建议使用正确的参数名:
CREATE FUNCTION overnight(p_row table_a)
RETURNS boolean AS
$$
SELECT (((p_row.duration / 60) * 100) + (p_row.duration % 60) + p_row.departure) >= 2400;
$$
language sql
stable;
然后你可以这样使用它:
SELECT *,table_a.function
FROM table_a;