Правильный синтаксис процедуры для функции Postgres как процедуры в BigQuery?

# #google-bigquery #user-defined-functions #bigquery-udf

Вопрос:

У меня есть следующая функция в postgres:

 create function my_function(price numeric, qty numeric, min_charge numeric, other_fee numeric) returns numeric  language plpgsql as $ DECLARE  _charge numeric; BEGIN  IF qty = 0 THEN  RETURN 0.00::numeric(19, 2);  END IF;  _charge := GREATEST(price * qty, min_charge)::numeric(19, 2);  RETURN (_charge   COALESCE(other_fee, 0.00))::numeric(19, 2); END; $;  alter function my_function(numeric, numeric, numeric, numeric) owner to my_location;  

Я хотел бы преобразовать это в BigQuery для той же функциональности, и до сих пор я пытался:

 create procedure my_schema.my_function(price numeric, qty numeric, min_charge numeric, other_fee numeric) BEGIN  IF qty = 0 THEN  RETURN 0.00::numeric(19, 2);  END IF;  _charge := GREATEST(price * qty, min_charge)::numeric(19, 2);  RETURN (_charge   COALESCE(other_fee, 0.00))::numeric(19, 2); END;  

Но я получаю следующую ошибку:

 Syntax error: Expected ";" but got floating point literal "0.00" at [4:16]  

Какова правильная команда для успешного выполнения той же функции в стиле postgres, что и процедура в BigQuery?

Ответ №1:

Я смог создать процедуру в BigQuery, заменив возвращаемый тип данных на FLOAT64 . Попробуйте этот сценарий:

 CREATE PROCEDURE mydataset.my_function(price numeric, qty numeric, min_charge numeric, other_fee numeric)  BEGIN  IF qty = 0 THEN   SELECT 0.00 AS FLOAT64;  END IF;  SELECT (GREATEST(price * qty, min_charge)   COALESCE(other_fee, 0.00)) AS FLOAT64;  END;  

введите описание изображения здесь

Ответ №2:

Я бы хотел преобразовать это в BigQuery для такой же функциональности

Рассмотрим приведенный ниже пример

 create temp function my_function(price numeric, qty numeric, min_charge numeric, other_fee numeric)  returns numeric as (  case when qty = 0 then 0  else greatest(price * qty, min_charge)   coalesce(other_fee, 0)  end ); select my_function(1, 1, 1, 1)   

если вы хотите постоянную функцию — просто удалите temp в create temp function

Комментарии:

1. вы пробовали? сработало ли это для вас? если это так — подумайте о том, чтобы проголосовать — это мотивирует нас ответить на ваши следующие вопросы :o)