我试图创建一个简单的函数,返回传递给该函数的最小值......但当运行时,它不工作,它只是返回相同的值,我传递给函数15,2,3,它应该返回2......有人能帮助我,告诉我为什么它不工作吗?
CREATE OR REPLACE
function
GET_LEAST_VALUE(in_numbers IN VARCHAR2)
RETURN VARCHAR2
IS
vReturn varchar2(50);
BEGIN
vReturn := least(in_numbers);
return vReturn;
END;
4条答案
按热度按时间bmp9r5qi1#
正如所评论的,它不能工作,因为你实际上是传递一个字符串给函数。
这里有一个选项-它将该字符串拆分为行;
regexp_substr
返回一个字符串(再次),所以-首先修剪它(以删除可能的空格),然后应用to_number
(否则你会比较字符串,这与比较数字不同)。最后,应用min
聚合函数,因为如果你传递了多个 number,least
将不起作用(你会得到too_many_rows错误)。de90aj5v2#
oalqel3c3#
为什么不工作?
当你传入一个字符串时,
LEAST
在将这个字符串与其他字符串进行比较时找到最小值,所以它返回这个字符串;这正是LEAST
想要做的。但是,它并不是你所期望的那样。
为什么它没有按照我的预期运行?
您希望将
'15,2,3'
计算为一个数字列表(即LEAST(15,2,3)
),但它不是一个数字列表,它是一个字符串文字,在人类看来,它恰好像一个数字列表,但在SQL引擎看来,它实际上只是一个字符串值,并将计算为LEAST('15,2,3')
。如何修复?
您需要通过集合(例如,内置的
SYS.ODCINUMBERLIST
varray集合类型)传入多个值:然后将其命名为:
或
fiddle
或者,您需要split the string into separate values,然后找到这些值中的最小值。
kokeuurv4#
它可以用一个用户定义的函数通过分隔符拆分字符串并返回一个元素数组来完成。在这种情况下,简单的plsql函数可以如下所示:
下面是用户定义的STRING_ARRAY类型和SPLIT()函数:
使用包含逗号分隔的数字列表的字符串进行测试调用
SPLIT()函数可以用任何分隔符(包括用于分隔句子中单词的空格字符)来分隔任何字符串。它也适用于没有正则表达式的数据库版本。
示例:-相同的数字由“xo”分隔-相同的结果
此致