Oracle PL/SQL函数,该函数接受可变数量的字符串参数并返回逗号分隔的

Oracle PL/SQL函数,该函数接受可变数量的字符串参数并返回逗号分隔的,oracle,plsql,Oracle,Plsql,我需要一个oraclepl/SQL函数,该函数接受数量可变的字符串参数,并返回以逗号分隔的字符串,忽略任何空值 在谷歌上找不到任何例子 举个例子,我会说: foo('hello', null, 'world') 它将返回: 'hello, world' 或 我不确定空值,但我建议传递到函数嵌套表: create or replace TYPE "OT_VARCHAR_TABLE" as table of varchar2(200); create or replace FUNCTION r

我需要一个oraclepl/SQL函数,该函数接受数量可变的字符串参数,并返回以逗号分隔的字符串,忽略任何空值

在谷歌上找不到任何例子

举个例子,我会说:

foo('hello', null, 'world')
它将返回:

'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;
:


从您的注释中,我假设表中有一行,有一些空列,您现在希望这是一个逗号分隔的字符串。。。实现这一点的方法比函数简单得多。鉴于下表:

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 )
这将删除前导散列:

trim(leading '#' from '#hello world')

文档更详细地描述了所有可能的场景。

您的数据是否已存储在表中,或者是否正在从客户端传入数据?只是基于查询per_addresses表的固定参数列表。但是有不同的地址样式和缺少的地址行。如果您使用11gR2,您可以使用listag()listag()在@Frank列中工作,而不是一行…我知道,但我知道OP有一个值列表,您可以将其包装在PL/SQL表中,然后使用select listag(column_value,…)如何遍历传入的参数?更新的答案。当您处理PL/SQLThank时,不要考虑迭代,但是您的代码似乎假设值都在包含多行的列中;而我在一行中有不同的地址列;又名addr_行1,addr_行2,addr_行3,addr_行4检查我帖子中的链接。它通过SQLFIDLE正确编译。也可以将参数作为不同的列传递。从T_MYTABLE a中选择foo(OT_VARCHAR_TABLE(a.column1、a.column2、a.column3));不知道为什么,但是的,这似乎有效。但我还是想知道如何做原始功能。你不明白@superdoophero的什么,也许我可以解释得更好一些?我只是用一个逗号将所有列连接在一起,删除任何前导或尾随的逗号,然后如果有两个,用一个替换它。。。它实际上有点错误,因为它不会处理
你好,,,,,world
,所以我已经更新了。我从未见过和from位。有没有办法在分隔逗号后添加空格?是的,只需在串联中添加一个:
a | |',“| | b…”
@super
trim( <TRAILING|LEADING|BOTH trim_character FROM> trim_string )
trim(both ';' from ';hello world;')
trim(';' from ';hello world;'
trim(leading '#' from '#hello world')