可変数の文字列パラメータを受け入れ、これらの文字列をカンマ区切りで返し、null 値を無視する Oracle PL/SQL 関数が必要です。
Googleで例が見つかりません。
たとえば、次のように呼び出します。
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')
ドキュメントでは、考えられるすべてのシナリオについて詳しく説明しています。
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