问题描述
你好,克里斯·萨克森,
我有一个下面的表格结构。
创建表格 “人物”
(“个人身份” 号码,
"GIVEN_NAME" VARCHAR2(100),
“类别” 编号 (50)
)
插入人值 (1,Connor,1001);
/
插入人的价值观 (2,克里斯·萨克森,1002);
/
插入人的价值观 (3,汤姆,1003);
有 “:” 分隔值将来自另一个输入源,
所以,基本上我得到这些值为: 1:2:3:4,并将它们转换为 ',' 分隔的值,这样它就可以通过使用下面的代码在子句中使用。
从 (substr(':' ||: P_VALUE | | ':',instr(':' ||: P_VALUE | | ':',',1,级别) 1,(instr(':'||: P_VALUE | |':',':',1,级别1)-instr(':'||: P_VALUE | |':',':',1,级别}}-1))
通过级别连接 <= regexp_count(':' ||: P_VALUE | | ':') - 1
运行上面的代码以获得根据需要工作的期望输出。
有没有更好的解决方案,我可以使用。
谢谢。
我有一个下面的表格结构。
创建表格 “人物”
(“个人身份” 号码,
"GIVEN_NAME" VARCHAR2(100),
“类别” 编号 (50)
)
插入人值 (1,Connor,1001);
/
插入人的价值观 (2,克里斯·萨克森,1002);
/
插入人的价值观 (3,汤姆,1003);
有 “:” 分隔值将来自另一个输入源,
所以,基本上我得到这些值为: 1:2:3:4,并将它们转换为 ',' 分隔的值,这样它就可以通过使用下面的代码在子句中使用。
从 (substr(':' ||: P_VALUE | | ':',instr(':' ||: P_VALUE | | ':',',1,级别) 1,(instr(':'||: P_VALUE | |':',':',1,级别1)-instr(':'||: P_VALUE | |':',':',1,级别}}-1))
通过级别连接 <= regexp_count(':' ||: P_VALUE | | ':') - 1
运行上面的代码以获得根据需要工作的期望输出。
有没有更好的解决方案,我可以使用。
谢谢。
专家解答
所以你想要有一个动态的在列表中,它接收表单中的值:
: 1:2:3:
?
如果是这样,你就走上了正确的道路。但是你的例子为我产生了太多的行:
为了克服这个问题,把代码在一个what子句中拆分行:
您可以在以下位置看到其他方法:
http://asktom.oracle.com/Misc/varying-in-lists.html
https://oracle-base.com/articles/misc/dynamic-in-lists
: 1:2:3:
?
如果是这样,你就走上了正确的道路。但是你的例子为我产生了太多的行:
CREATE TABLE PEOPLE
( PERSON_ID NUMBER,
GIVEN_NAME VARCHAR2(100),
CATEGORY number
);
INSERT INTO people VALUES(1,'Connor',1001);
INSERT INTO people VALUES(2,'Chris Saxon',1002);
INSERT INTO people VALUES(3,'Tom',1003);
var p_value varchar2(20);
exec :p_value := ': 1:2:3:4';
select count(*) from people
where person_id in (
substr(':'||:P_VALUE||':',
instr(':'||:P_VALUE||':',':',1,level)+1,
(instr(':'||:P_VALUE||':',':',1,level + 1) - instr(':'||:P_VALUE||':',':',1,level))- 1)
)
CONNECT BY LEVEL <= regexp_count(':'||:P_VALUE||':',':') - 1;
COUNT(*)
39
为了克服这个问题,把代码在一个what子句中拆分行:
with vals as (
select substr(':'||:P_VALUE||':',
instr(':'||:P_VALUE||':',':',1,level)+1,
(instr(':'||:P_VALUE||':',':',1,level + 1) - instr(':'||:P_VALUE||':',':',1,level))- 1)
from dual
CONNECT BY LEVEL <= regexp_count(':'||:P_VALUE||':',':') - 1
)
select * from people
where person_id in (select * from vals);
PERSON_ID GIVEN_NAME CATEGORY
1 Connor 1,001
2 Chris Saxon 1,002
3 Tom 1,003
您可以在以下位置看到其他方法:
http://asktom.oracle.com/Misc/varying-in-lists.html
https://oracle-base.com/articles/misc/dynamic-in-lists
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




