查询错误 - 单行查询返回多行

时间:2015-01-07 14:08:36

标签: oracle csv case regexp-substr

我有一个查询,输入值为:" 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。

1 个答案:

答案 0 :(得分: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        

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