仅对第一行执行虚拟列

问题描述

我正在尝试使用一个函数在我的表上创建一个虚拟列。该函数可以自行正确执行,但是当我添加到我的表中时:

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;

Online example