有一表:ID    Values
1     1,2,3
2     3,4
3     2,3
4     null
如何查询Values字段中1、2、3等这些值(如果存在的话)?
如:ID为1的Values中1、2、3这三个值,ID为2的3、4这两个值
因为往数据库里存的是多个值集合,中间用逗号分割开来。想查询的时候把这些值再分别提取出来。

解决方案 »

  1.   

    如何查询呢,是整串匹配,可以用正则表达式,或者LIKE,或者INSTR
    看你具体需求了
    例如
    select  * from tab
    where values like '%3,4%'
      

  2.   


    我只是举了一个例子,因为你不知道里面是否有哪些值。所以不能 like '%3,4%'我是想取出所有的值
      

  3.   

    PL/SQL 中没有split函数,需要自己写。这里提供了一个参考:
    create or replace type type_split as table of varchar2(50);  --创建一个  type  ,如果为了使split函数具有通用性,请将其size 设大些。--创建functioncreate or replace function split(   p_list varchar2,   p_sep varchar2 := ',')  return type_split pipelined is   l_idx  pls_integer;   v_list  varchar2(50) := p_list;begin   loop      l_idx := instr(v_list,p_sep);      if l_idx > 0 then          pipe row(substr(v_list,1,l_idx-1));          v_list := substr(v_list,l_idx+length(p_sep));      else          pipe row(v_list);          exit;      end if;   end loop;   return;end split;
      

  4.   

    写个函数,按照自己需求将结果全部拼起来,
    如果取出来的结果作为主键再进行查询用,
       可以在函数里面拼成('1','2','3')样子,
       直接用 select t.* from test t
              where t.key in ('1','2','3');
    如果仅仅为了放到数组里面,能不在数据库里处理就不要在里面处理了吧。CREATE OR REPLACE FUNCTION GET_STRVALUE RETURN VARCHAR2 is
        strReturn varchar2(1000) := '';
        flg  boolean :=true;
        cursor aa_cur is
            select t.b as b from aa t;    
    begin
        for l_data in aa_cur loop
            if l_data.b is not null then
                if flg = true then
                    flg:=false;
                    strReturn :=  l_data.b;                
                else
                    strReturn := strReturn || ',' || l_data.b; 
                end if;
            end if;
        end loop;
        return strReturn ;
    EXCEPTION
        WHEN OTHERS THEN
            RETURN null;
    end;