匿名用户
1级
2018-05-30 回答
PL/SQL中是没有数组的概念,他的集合数据类型和数组是相似的,所以可以用ARRAY来解决问题。
第一步:创建你所需的ARRAY类型
Create Type varray_answer as varray(10) of varchar2(50);
第二步:把你的sf_split_string
函数返回的类型设置为varray_answer
第三步:
select era_id, us_id, sf_split_string(answer, ':') as listanswer, tu.name
from evt_result_answer, tuser tu
where e_id = 37200
and ques_id = 94603
and tu.id = evt_result_answer.us_id
/**判断是否含有某个值*/
and listanswer.EXISTS('2');
集合方法
pl/sql预定义了在varray 和嵌套表实例上进行调用的方法。这些方法能在集合上执行一定的功能。
EXISTS
该函数返回集合中第一个元素的索引,如果集合为空,返回NULL
Collection.EXISTS(index)
COUNT
该函数集合元素的数目
Collection.COUNT
DELETE
该过程从嵌套表中删除一个或多个或合部元素
Table_name.DELETE 删除所有元素
Table_name.delete(index)删除指定索引的记录
Table_name.delete(start_index,end_index)删除区间内元素
等方法
追问:
CREATE OR REPLACE TYPE Varchar2Varray IS VARRAY(100) of VARCHAR2(40);
写函数前已经写这个了
但是执行你说的sql报错
追答:
返回的是Varchar2Varray这个类型么
追问:
对啊!就是这个类型
CREATE OR REPLACE TYPE Varchar2Varray IS VARRAY(100) of VARCHAR2(40);然后按照你说的不行,最好加下我q865003051 说下
追答:
在sql中不能执行集合的函数,必须在declare块或者存储过程块中才能执行。
不过你如果想判断这个字段是否含有2的话 根本不需要这么麻烦
select era_id, us_id, sf_split_string(answer, ':') as listanswer, tu.name
from evt_result_answer, tuser tu
where e_id = 37200
and ques_id = 94603
/***/
and tu.id = evt_result_answer.us_id
AND INSTR(ANSWER,'2') >0这句sql就可以