Как перевести функцию из MySQL в Firebird? - PullRequest
0 голосов
/ 30 сентября 2018

как мне перенести эту функцию в 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

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Вы можете создать Firebird 3 PSQL функцию , которая будет практически идентична функции 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.

0 голосов
/ 05 октября 2018

Есть 3 способа извлечь данные, которые вам нужны:

  1. Добавить CASE в ваш 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: The RDB$DATABASE это просто пример таблицы результата, а ": in_num" и ": in_group" это переменная / параметр, которую вы можете изменить с помощью столбца одной таблицы или просто ввести нужное значение

  2. Создать ПРОЦЕДУРУ, например:

    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)
    
  3. Вы можете создать библиотеку (UDF) с использованием языка, подобного C ++, который генерирует .dll ou .so (для linux) с функцией candidat и затем добавляет его в базу данных.

    Для этого вы можете посмотреть документацию на https://www.firebirdsql.org/en/writing-udfs-for-interbase/

    Тогда вы можете использовать UDF, например:

    select
      candidat(1,3)
    from
      <TABLE>
    
...