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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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就可以

参考技术A sf_split_string 函数返回的是什么类型的数据?
table of varchar2 ?
还是
varray of varchar2?追问

q865003051加下我Q 说下

varray of varchar2

参考技术B 查询条件加上 and instr(':'||answer||':',':2:')>0就可以了

SQL 多选一个字段值只选一次 和多次从表里查询但查的字段较少 相比哪个性能更好?为啥?

SQL 多次从一个表中查询耗费什么?

这个要看你的数据量来决定.

SQL 多选一个字段值只选一次
意味着你 只发送一次 SQL 语句, 然后获得结果集合。

多次从表里查询但查的字段较少
意味着你 发送了多个 SQL 语句, 然后分别获得结果集合。

SQL 多次从一个表中查询
耗费的是:

网络之间,要额外传送SQL语句 (这个很多情况下,消耗可以忽略)

数据库需要 分析你的 SQL语句的合法性,并做SQL的解析,并分析查询计划,并从多个查询计划中,选择一个最优的查询计划,然后进行执行处理。 (这个过程消耗比较大,假如数据库参数配置的好。或者开发语言处理的时候,就是按照 一条SQL,修改参数的方式处理的话,那么消耗也不大)追问

数据倒是不多,关键是我想了解清楚性能的问题。

追答

数据不多,那就一次 获取完就可以了.

因为这个没有一个固定的值.
假如你数据量大, 比如1000万.
你要一个 SQL语句, 一次 一口气读这一千万数据, 即时你数据库受得了,你的 客户端程序不知道会不会内存溢出。
那么这个时候,应该需要拆分处理,比如一条SQL获取 1万行, 或者 10万行, 客户端处理完一批数据了,再去重新检索一次,获取下一批的数据。

但是你数据量很小,比如就10行数据。
那显然是 一条SQL获取一下, 客户端一次就把数据获取完了。
这个情况下,要分 10条 SQL语句, 去执行10次, 分别获取 10次 1行数据。没有太大的意义。

参考技术A SQL 多选一个字段值只选一次 当然比 多次从表里查询但查的字段较少 相比哪个性能更好
因为 SQL 多次从一个表中查询耗费 i/0 开销,如果多个用户的话 容易出现 假死 i /o 开销过大
SQL 多选一个字段值只选一次 多选一个字段 对于数据库来说 基本没有什么影响, 但主要是在程序中加载时,循环取出字段 多了点 也就是 关键看程序
参考技术B SQL多次从一个表中查询的话,只会在内存中提取相应的数据,别的过程还是要正常走的!追问

比如我依次用一条新的sql从database中取id为1,2,3,4的数据,执行完id=1的那次以后,2,3,4的不会在缓存中取吧

追答

这个主要还是要看你实用的数据库是什么了ORACLE在这点上要比SQLSERVER要好很多,SQLSERVER本身内存使用是很大的,而且缓存中清除也不是很及时!

追问

好吧 我用的MySql数据库,数据不是很多,点击量大了会不会出现一楼说的那种死页面的情况?

追答

看你服务器的性能了,这种问题分页取一下就很简单解决了!

参考技术C Select Distinct(*) From Table AS Ta inner Join Table As Tb on Ta.A=Tb.a and Ta.B<>Tb.B

以上是关于oracle 某个字段的结果是一个集合,怎么知道这个结果中是不是有某个值的主要内容,如果未能解决你的问题,请参考以下文章

mysql如何查询某字段里两个值相加结果等于已知道的一个数字

oracle 10g 怎么查询某个字段值包含小写字母

oracle数据库通过某个字段的值查询数据怎么写sql语句,不知道具体表,不知道是哪个字段?

怎么在oracle数据库中查询某个值在哪个表中?

用PLSQL查询oracle数据库中某个表,查询结果如果包含两个字段时就会卡死

oracle 中怎样把查询结果当做已知量或赋值给某个变量?