1

可変数の文字列パラメータを受け入れ、これらの文字列をカンマ区切りで返し、null 値を無視する Oracle PL/SQL 関数が必要です。

Googleで例が見つかりません。

たとえば、次のように呼び出します。

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

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