我有一个查询,输入值为:" 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。
答案 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
我从你的名字串中取出空格,以便它能正确匹配。如果文本框中的实际字符串有空格,则需要在子查询中处理它们。