仅对第一行执行的虚拟列

Virtual Column Only Executing for First Row

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

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
$$;

如何确保我的 table 的每一行都执行代码?

谢谢!

让您的函数接受您需要的字段,而不是整个 table。

SELECT *, overnight(duration,departure) FROM table_a;

CREATE FUNCTION overnight(duration,departure)
RETURNS boolean AS
SELECT CASE WHEN ... THEN TRUE ELSE FALSE END;
$$;

您需要在 select 中引用参数并删除 FROM 子句(select 来自 table 不是来自行参数)。

为了避免 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