我在postgres数据库中插入大量来自不同来源的测量数据。这些数据是测量值和不确定性(以及大量的辅助数据)问题是,在某些情况下,我会得到一个绝对误差值,例如123 +/- 33,在其他情况下,我得到的相对误差为测量值,例如123 +/- 10%。我想用绝对误差来存储所有的测量值,即后者应该存储为123 +/- 12.3-(在这一点上,我不在乎太多的有效位数)触发器检查有效输入
我的想法是使用触发器来做到这一点。基本上,如果错误是数字,则将其存储为原样,如果它是非数字,则检查最后一个字符是否为'%',在这种情况下,将其与测量值相乘,除以100并存储结果值。我从这里得到了一个isnumeric-function:isnumeric() with PostgreSQL,它工作正常。但是,当我试图将其作为触发器时,就好像在触发器触发之前输入检查了有效性,以便在我有任何可能性对值执行任何操作之前,插入操作就会被终止。
我triggerfunction:(需要做的计算,只是误差设置为0这里...
create function my_trigger_function()
returns trigger as'
begin
if not isnumeric(new.err) THEN
new.err=0;
end if;
return new;
end' language 'plpgsql';
然后我把它连接到表:
create trigger test_trigger
before insert on test
for each row
execute procedure my_trigger_function();
这样做,我对于以下插入,预计会得到val = 123和err = 0
insert into test(val,err) values(123,'10%');
但插入失败并显示“invalid input syn syn税类型数字“然后必须触发之前,我的触发器有可能看到数据(或者我误解了一些基本的东西)。是否有可能使new.err数据类型不可知,或者我可以更早地运行触发器,还是我想做的事情不可能?
对于触发器来说这是不可能的,因为之前SQL解析器失败了。最接近的选择是提供一个函数'myfunc(text)returns numeric'并将其应用于VALUES子句中。 –
谢谢,那就是我担心的 - 回到制图板......: -/ – MortenSickel
@DanielVérité,如果你重写你的表扬作为答案,我可以接受它。 – MortenSickel