暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 代码增强

askTom 2016-07-18
100

问题描述

你好,克里斯·萨克森,

我有一个下面的表格结构。

创建表格 “人物”
(“个人身份” 号码,
"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:



如果是这样,你就走上了正确的道路。但是你的例子为我产生了太多的行:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论