oracle 某个字段的结果是一个集合,怎么知道这个结果中是否有某个值

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
得到的结果是

listanswer的结果如下

我怎么写sql才能知道listanswer中 有2这个值
sf_split_string是自己写的函数,类似于java的split 就是将(1:2:7:9) 这样的字符串 换成 1 2 7 9 这样的集合 然后看看集合中是否有2这个值

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就可以

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-25
sf_split_string 函数返回的是什么类型的数据?
table of varchar2 ?
还是
varray of varchar2?追问

q865003051加下我Q 说下

varray of varchar2

第2个回答  2013-12-25
查询条件加上 and instr(':'||answer||':',':2:')>0就可以了
相似回答