如何将此功能转移到firebird
create function `candidat`(in_num decimal(10,2),
in_group integer unsigned)
returns integer unsigned
deterministic
language sql
begin
return case in_group when 1 then floor(in_num / 3.0 + 0.99)
when 2 then floor(in_num / 3.0 + 0.50)
else floor(in_num / 3.0) end;
end
答案 0 :(得分:1)
有3种方法可以提取您想要的数据:
在您的SQL中添加案例:
select
case when :in_group = 1 then floor(:in_num / 3.0 + 0.99)
when :in_group = 2 then floor(:in_num / 3.0 + 0.50)
else floor(:in_num / 3.0) end
from
RDB$DATABASE
OBS:RDB$DATABASE
只是结果的表示例,而“:in_num”和“:in_group”是变量/参数,您可以使用一个表的列或仅更改注入所需的值
创建一个过程,如:
SET TERM ^ ;
CREATE OR ALTER procedure candidat (in_num decimal(10,2), in_group integer)
returns ( calculed_value integer )
as
begin
if (:in_group = 1) then
begin
calculed_value = floor(:in_num / 3.0 + 0.99);
end
else if (:in_group = 2) then
begin
calculed_value = floor(:in_num / 3.0 + 0.50);
end
else
begin
calculed_value = floor(:in_num / 3.0);
end
suspend;
end
^
SET TERM ; ^
您可以像这样使用它:
select
CALCULED_VALUE
from
candidat( 100, 2)
您可以使用C ++之类的语言创建库(UDF),该库会生成.dll
函数,.so
ou candidat
(对于Linux),然后将其添加到数据库。
为此,您可以查看https://www.firebirdsql.org/en/writing-udfs-for-interbase/
上的文档然后您可以使用UDF,例如:
select
candidat(1,3)
from
<TABLE>
答案 1 :(得分:0)
您可以创建Firebird 3 PSQL function,该功能几乎与MySQL函数相同。市长的区别只是创建语法:
create function candidat(in_num decimal(10,2),
in_group integer)
returns integer
as
begin
return case in_group when 1 then floor(in_num / 3.0 + 0.99)
when 2 then floor(in_num / 3.0 + 0.50)
else floor(in_num / 3.0) end;
end
由于Firebird没有无符号整数,因此您需要使用普通的(有符号)integer
。鉴于输入应足够,否则请考虑切换到bigint
。