仅对第一行执行的虚拟列
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;
我正在尝试使用一个函数在我的 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;