-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) 

有没有办法实现所需的功能?这不会对查询进行太多更改,并将 CASE 包含在 regexp_substr 中。

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      

当它为空时:

exec :username := null;

...该查询获取所有行:

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

我从您的姓名字符串中取出了空格,以便正确匹配。如果文本框中的实际字符串有空格,则需要在子查询中处理它们。

于 2015-01-07T14:17:21.920 回答