用户定义的函数仅返回列中的第一个值

问题描述 投票:0回答:1

我正在为一个类编写一个函数,该函数应该转换我表中的列。我正在使用他们给我的数据库(DVD 租赁)。我认为最终目标是添加此函数作为另一个查询中列名的替代品。 (我只是猜测,因为这门课的说明非常模糊,而且到目前为止老师没有提供任何帮助)

CREATE OR REPLACE FUNCTION rental_amount()
RETURNS text AS $dollar_amount$
DECLARE dollar_amount text;
BEGIN
SELECT TO_CHAR(amount,'l9D99') amount_format INTO dollar_amount
FROM detail_report
ORDER BY title;
RETURN dollar_amount;
END; $dollar_amount$
LANGUAGE plpgsql;

我的函数所做的(或者我正在尝试做的)基本上是在金额列中的数字之前附加一个美元符号。 调用该函数时,它仅返回第一行的第一个值。

但是,当我在函数内运行选择查询时,我获得了所有值。 您的文字enter image description here

我该如何解决这个问题?

起初我尝试让函数返回一个表,但后来他们添加了额外的要求,即我必须在另一个查询中包含该函数。我尝试过很多不同的方式来写这篇文章,但我对 postgres 没有太多经验,而且老师们似乎也不想提供帮助。当你问任何问题时,他们只说参考 xyz 或标题,这没有帮助。

postgresql function user-defined-functions return-type pgadmin-4
1个回答
0
投票

要实现转换列值的目标(例如,在

amount
列中的数字前附加美元符号)并在另一个查询中使用此转换,您可以创建一个 PostgreSQL 函数。考虑到您的要求,听起来对单个值(而不是返回集合或表)进行操作的 SQL 函数是最合适的。然后可以为查询中的每一行调用此函数。

这是一个基本示例,说明如何在 PostgreSQL 中编写此类函数并在查询中使用它。此示例假设我们正在使用名为

amount
的表中名为
payments
的列。该函数将被设计为采用单个
amount
值作为输入,通过添加美元符号前缀对其进行转换,然后将转换后的值作为文本字符串返回。

第 1 步:创建函数

此函数接收一个数值并将其作为带有美元符号的格式化文本字符串返回。

CREATE OR REPLACE FUNCTION prepend_dollar_sign(amount NUMERIC)
RETURNS TEXT AS $$
BEGIN
    -- Return the amount as a text string with a dollar sign prefix
    RETURN '$' || amount::TEXT;
END;
$$ LANGUAGE plpgsql;

第 2 步:在查询中使用函数

您现在可以在 SELECT 查询中使用此函数来转换

amount
表(或任何具有数字
payments
列的表)中的每个
amount
值。

SELECT prepend_dollar_sign(amount) AS transformed_amount
FROM payments;

此查询将为

prepend_dollar_sign
中的每一行调用
payments
,根据需要转换
amount
列。

解释

函数

prepend_dollar_sign
被定义为接受单个
NUMERIC
输入并返回
TEXT
字符串。它将美元符号与数字
amount
连接起来,并使用
amount
转换将
::TEXT
转换为文本。这使得该函数变得灵活,允许在查询中使用它来动态转换各个列的值。

在另一个查询中使用该函数

如果您需要将此函数作为较大查询的一部分或与其他列一起包含,您可以轻松完成。例如:

SELECT
    p.payment_id,
    prepend_dollar_sign(p.amount) AS transformed_amount,
    p.payment_date
FROM payments p;

此查询演示了如何将自定义函数与

payments
表中的其他列一起使用。

注意

如果类的需求发生变化或者需要更具体的功能,可以相应地调整功能。这种方法的主要优点是它的简单性以及它允许将转换后的数据集成到 SQL 查询中的直接方式。

我们在这里发表了很多关于 PostgreSQL 的博客:https://minervadb.xyz/blog/

© www.soinside.com 2019 - 2024. All rights reserved.