我需要一个 Oracle PL/SQL 函数,它接受可变数量的字符串参数并返回这些字符串,这些字符串以逗号分隔,并且忽略任何空值。
在谷歌上找不到任何例子。
所以例如我会打电话:
foo('hello', null, 'world')
它会返回:
'hello, world'
或者
foo('hello', 'world')
根据您的评论,我假设您在表格中有一行,有一些空列,您现在希望这是一个逗号分隔的字符串......有很多比函数更简单的方法。给定下表:
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() 的更好解释(文档);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')
该文档更详细地描述了所有可能的场景。
我不确定空值,但我建议传递给函数嵌套表:
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