我正在尝试创建一个函数,它将根据查找表中的分数和版本号返回标签
所以我有一张查阅表
标签 | 版本 | 分钟 | 最大限度 |
---|---|---|---|
高的 | 1 | 7 | 10 |
医学 | 1 | 3 | 6 |
低的 | 1 | 0 | 2 |
高的 | 2 | 8 | 10 |
医学 | 2 | 5 | 7 |
低的 | 2 | 0 | 4 |
create function get_label(score int, version int, vector string)
returns varchar
language sql as
$$
select label
from lookup
where version = coalesce(version, to_number(substr(vector,2,1)))
and score between min and max;
$$
我有各种表,我想为它们设置一个新的派生标签列。当我运行更新语句时,其中一些表有一个版本,而另一些表有一个包含版本号的向量。
alter table my_table
set derived_label = get_label(score,version,null);
alter table my_table2
set derived_label = get_label(score,null,vector);
我收到以下错误
Unsupported subquery type cannot be evaluated
等同于
因此,同意这是一个完整的表重写后,我们可以使用替换形式(您可能需要使用其他一些参数来确保存在连续性权限等)。
所以现在如果创建表作为选择
我们可以加入选择的工作:
我还假设了参数和列名的用法
m
。l
并且您可能希望简化合并,因为它过于复杂。优化器将对此进行编辑。
并且我假设您希望在无匹配时将值变为 NULL。此时您可能应该双重连接,并且只执行一次更新/创建替换。
另外,我将使用 CTAS 模式而不是 UPDATE,因为它允许您控制排序顺序,这会影响表的修剪行为。