本帖最后由 wang4382 于 2011-09-01 16:25:19 编辑

解决方案 »

  1.   


    select a.user_id 
      from table2 a, 
           table1 b
     where instr(b.user_arr, a.user_id) > 0;
      

  2.   


    其实应该考虑在字符串的两端都加上','逗号才比较好吧?
    SELECT A.USER_ID 
    FROM TABLE2 A,
    TABLE1 B
    WHERE INSTR(','||B.USER_ARR||',',','|| A.USER_ID || ',') > 0这样可以防止用3来找也能找到记录,而其实应该是34才能匹配。
      

  3.   


    是个好方法,得到的是一个列表,有什么办法把列表又拼成一条记录?
    还有这样是不是全表检索了,会不会影响效率。我不是它用在子查询中,用来把user_id转换成user_name。
      

  4.   

    写一个管道函数就可以了FUNCTION split(p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
      
       RETURN char4k_ntab_type
        PIPELINED IS
        j    INT := 0;
        i    INT := 1;
        len  INT := 0;
        len1 INT := 0;
        str  VARCHAR2(4000);
      BEGIN
        len  := length(p_str);
        len1 := length(p_delimiter);
        WHILE j < len LOOP
          j := instr(p_str, p_delimiter, i);
          IF j = 0 THEN
            j   := len;
            str := substr(p_str, i);
            PIPE ROW(str);
            IF i >= len THEN
              EXIT;
            END IF;
          ELSE
            str := substr(p_str, i, j - i);
            i   := j + len1;
            PIPE ROW(str);
          END IF;
        END LOOP;
        RETURN;
      END;
    然后这么调用
    select user_id from table2 where user_id in (select column_value from table(split('11,22,33,44',',')));也可以将'11,22,33,44'替换为你从另外一个表查询出来的字段