我正在嘗試創建一個基于表格進行貨幣轉換的函式。該表名為 ds_exchange_rate,如下所示:

如您所見,基本列僅包含美元,貨幣可以是 BRL 或 MXN,而 rate 是該給定日期從美元到 BRL/MXN 的轉換值。
為了使我的查詢更簡單,我嘗試創建一個處理轉換的函式。函式陳述句如下所示:
CREATE OR REPLACE FUNCTION CONVERT_FROM_TO(
value NUMERIC,
from_currency TEXT,
to_currency TEXT,
reference_date DATE DEFAULT CURRENT_DATE
)
RETURN NUMERIC
LANGUAGE plpgsql
AS
$$
DECLARE
conversion_rate NUMERIC;
BEGIN
IF from_currency = 'USD' THEN
SELECT rate
INTO rate
FROM ds_exchange_rate
WHERE currency = to_currency
AND date = reference_date;
RETURN value * conversion_rate;
ELSIF to_currency = 'USD' THEN
SELECT 1/rate
INTO rate
FROM ds_exchange_rate
WHERE currency = from_currency
AND date = reference_date;
RETURN value * conversion_rate;
END IF;
END;
$$;
我只想要美元 <-> BRL/MXN 轉換,所以不用擔心 BRL <-> MXN。
在嘗試創建函式時,我在第一個回傳和 elsif 處或附近遇到了一些語法錯誤。我相信它與“;”有關,但我無法修復它(我不習慣創建 SQL 函式)。
如果有人可以提供幫助,我將不勝感激!
錯誤資訊
SQL Error [42601]: ERROR: syntax error at or near "ELSIF"
Position: 1
uj5u.com熱心網友回復:
有一些錯誤,回傳函式的保留字是“returns”,你的選擇也應該回傳到你的 conversion_rate 變數中,所以更正如下:
CREATE OR REPLACE FUNCTION CONVERT_FROM_TO(
value NUMERIC,
from_currency TEXT,
to_currency TEXT,
reference_date DATE DEFAULT CURRENT_DATE
)
returns NUMERIC
LANGUAGE plpgsql
AS
$$
DECLARE
conversion_rate NUMERIC;
BEGIN
IF from_currency = 'USD' THEN
SELECT rate
INTO conversion_rate
FROM ds_exchange_rate
WHERE currency = to_currency
AND date = reference_date;
RETURN value * conversion_rate;
ELSIF to_currency = 'USD' THEN
SELECT 1/rate
INTO conversion_rate
FROM ds_exchange_rate
WHERE currency = from_currency
AND date = reference_date;
RETURN value * conversion_rate;
END IF;
END;
$$;
uj5u.com熱心網友回復:
您可以將其簡化為單個陳述句,洗掉對“USD”轉換的依賴并創建一個 sql 函式。
create or replace function convert_rate(
value numeric,
from_currency text,
to_currency text,
reference_date date default current_date
)
returns numeric
language sql
as $$
select case when (base, currency) = (from_currency, to_currency)
then round(value * rate,6)
when (base, currency) = (to_currency, from_currency)
then round(value / rate,6)
else null
end
from ds_exchange_rate
where (base, currency) in ( (from_currency, to_currency), (to_currency, from_currency) )
and ex_date = reference_date;
$$;
這確實取決于一天只有一組base和值。currency即,對于任何日期,您都可以擁有 (base, currency) = ('USD','MXN') 或 ('MXN','USD'),但是你不會同時想要兩者。這可以通過創建一個訂購基礎貨幣的唯一索引來處理。
create unique index one_way_daily_conversion
on ds_exchange_rate (date,least(base,currency), greatest(currency,base));
見演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/498454.html
標籤:sql PostgreSQL sql函数
上一篇:具有冗余值的漸進等級
