查询错误 - 单行查询 returns 多于一行
Query Error - Single row query returns more than one row
我有一个查询,其中输入值为:"Amar, Akbar, Anthony"
我希望查询将输入值视为:'Amar'、'Akbar'、'Anthony'。我有一个 regexp_substr 可以在正常查询中工作并达到目的,但是当我将它与 Case 放在一起时,它会给出以下错误。
Single row query returns more than one row
编写 CASE 是为了如果用户未在文本框中输入任何内容,则查询应 return 所有行,如果用户输入内容,结果应显示匹配值。
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.
中
我不确定我是否遵循您的逻辑,但我认为这就是您要找的:
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
我从你的名字字符串中去掉了空格,这样它就能正确匹配。如果文本框中的实际字符串有空格,则需要在子查询中处理它们。
我有一个查询,其中输入值为:"Amar, Akbar, Anthony"
我希望查询将输入值视为:'Amar'、'Akbar'、'Anthony'。我有一个 regexp_substr 可以在正常查询中工作并达到目的,但是当我将它与 Case 放在一起时,它会给出以下错误。
Single row query returns more than one row
编写 CASE 是为了如果用户未在文本框中输入任何内容,则查询应 return 所有行,如果用户输入内容,结果应显示匹配值。
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.
中我不确定我是否遵循您的逻辑,但我认为这就是您要找的:
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
我从你的名字字符串中去掉了空格,这样它就能正确匹配。如果文本框中的实际字符串有空格,则需要在子查询中处理它们。