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

时间:2013-05-16 09:08:24

标签: oracle plsql

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

在谷歌上找不到任何示例。

例如,我会打电话给:

foo('hello', null, 'world')

它将返回:

'hello, world'

foo('hello', 'world')

2 个答案:

答案 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

SQL Fiddle


为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;

Result

aa,bb,cc