# #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)