我需要一个Oracle PL / SQL函数,它接受可变数量的字符串参数,并返回以逗号分隔的字符串,并忽略任何空值。
在谷歌上找不到任何示例。
例如,我会打电话给:
foo('hello', null, 'world')
它将返回:
'hello, world'
或
foo('hello', 'world')
答案 0 :(得分:3)
从你的评论我假设你在一个表中有一行,有一些空列,你现在希望这是一个以逗号分隔的字符串...有很多更简单的方法这样做比一个功能。鉴于下表:
create table the_table (
a varchar2(100)
, b varchar2(100)
, c varchar2(100)
, d varchar2(100)
);
insert into the_table
values ('hello',null,'world', null);
你可以这样做,逗号分隔所有内容,然后自行清理。
select regexp_replace(trim(both ',' from a || ',' || b || ',' || c || ',' || d)
, ',{2,}', ',')
from the_table
为TRIM()提供更好的解释(documentation); TRIM()的默认行为是删除尾随和前导空格,但是,它可以用于使用以下语法删除任何尾随和/或前导单个字符:
trim( <TRAILING|LEADING|BOTH trim_character FROM> trim_string )
其中
TRAILING|LEADING|BOTH
表示您是要删除尾随或前导字符,还是两者都删除。trim_character
是您要删除的字符FROM
是语法糖,使整个事情变得有意义。如果指定了替代字符,那么TRIM()会不删除尾随和前导空格。
例如以下内容将同时删除尾随和前导的分号:
trim(both ';' from ';hello world;')
trim(';' from ';hello world;'
这会删除主要的哈希值:
trim(leading '#' from '#hello world')
文档更详细地描述了所有可能的场景。
答案 1 :(得分:0)
我不确定null值,但我建议传入函数嵌套表:
create or replace TYPE "OT_VARCHAR_TABLE" as table of varchar2(200);
create or replace FUNCTION removeNulls(v_in_table OT_VARCHAR_TABLE) RETURN OT_VARCHAR_TABLE IS
....
在存储过程代码中,您只需过滤值即可。这很简单。
<强> UPD.1 强>
以下是完整代码:
create or replace FUNCTION foo(v_in_table OT_VARCHAR_TABLE) RETURN VARCHAR2 IS
vRes VARCHAR2(1000);
BEGIN
SELECT
listagg(t.column_value,',') within group (order by t.column_value)
INTO vRes
FROM TABLE (CAST(v_in_table AS OT_VARCHAR_TABLE)) t;
return vRes;
END;
/
用法:
select foo(OT_VARCHAR_TABLE('cc','aa', null, 'bb', null , null )) from sys.dual;
aa,bb,cc