1

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

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

所以例如我会打电话:

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

它会返回:

'hello, world'

或者

foo('hello', 'world')
4

2 回答 2

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小提琴


提供对 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')

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

于 2013-05-16T10:12:20.833 回答
0

我不确定空值,但我建议传递给函数嵌套表:

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
于 2013-05-16T09:21:12.930 回答