-1

入力値が「Amar、Akbar、Anthony」であるクエリがあります。

入力値を「Amar」、「Akbar」、「Anthony」として処理するクエリが必要です。通常のクエリで機能し、目的を果たす regexp_substr がありますが、Case で配置すると、以下のエラーが発生します。

Single row query returns more than one row

CASE は、ユーザーがテキストボックスに何も入力しない場合、クエリはすべての行を返し、ユーザーが何かを入力した場合、結果は一致する値を表示するように記述されています。

Select * from test_tbl a where 
     (
            CASE
              WHEN TRIM (:username) IS NULL
              THEN NVL (a.user_name, 'NOTHING')
              WHEN TRIM (UPPER (:username)) = 'NOTHING'
              THEN NVL (a.user_name, :username)
              ELSE UPPER (a.user_name)
            END) LIKE (
            CASE
              WHEN TRIM (:username) IS NULL
              THEN NVL (a.user_name, 'NOTHING')
              WHEN TRIM (UPPER (:username)) = 'NOTHING'
              THEN :username
              ELSE ((select regexp_substr(:username,'[^,]+', 1, level) from dual connect by regexp_substr(:username, '[^,]+', 1, level) is not null))
            END) 

必要な機能を実現する方法はありますか? それはクエリをあまり変更せず、regexp_substr に CASE を含めます。

4

1 に答える 1

2

私があなたの論理に従っているかどうかは完全にはわかりませんが、これがあなたが探しているものだと思います:

select * from test_tbl a
where :username is null
or a.user_name in (
  select regexp_substr(:username,'[^,]+', 1, level) from dual
  connect by regexp_substr(:username, '[^,]+', 1, level) is not null
)

いくつかのダミー データ: とバインド変数:

create table test_tbl (user_name varchar2(10));

insert into test_tbl values ('Amar');
insert into test_tbl values ('Akbar');
insert into test_tbl values ('Joe');

var username varchar2(80);

username設定時

exec :username := 'Amar,Akbar,Anthony';

.. そのクエリは次のようになります。

USER_NAME
----------
Amar       
Akbar      

null の場合:

exec :username := null;

...そのクエリはすべての行を取得します:

USER_NAME
----------
Amar       
Akbar      
Joe        

適切に一致するように、名前の文字列からスペースを削除しました。テキストボックスからの実際の文字列にスペースが含まれている場合は、サブクエリでそれらを処理する必要があります。

于 2015-01-07T14:17:21.920 に答える