select a.user_id from table2 a, table1 b where instr(b.user_arr, a.user_id) > 0;
其实应该考虑在字符串的两端都加上','逗号才比较好吧? SELECT A.USER_ID FROM TABLE2 A, TABLE1 B WHERE INSTR(','||B.USER_ARR||',',','|| A.USER_ID || ',') > 0这样可以防止用3来找也能找到记录,而其实应该是34才能匹配。
写一个管道函数就可以了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'替换为你从另外一个表查询出来的字段
select a.user_id
from table2 a,
table1 b
where instr(b.user_arr, a.user_id) > 0;
其实应该考虑在字符串的两端都加上','逗号才比较好吧?
SELECT A.USER_ID
FROM TABLE2 A,
TABLE1 B
WHERE INSTR(','||B.USER_ARR||',',','|| A.USER_ID || ',') > 0这样可以防止用3来找也能找到记录,而其实应该是34才能匹配。
是个好方法,得到的是一个列表,有什么办法把列表又拼成一条记录?
还有这样是不是全表检索了,会不会影响效率。我不是它用在子查询中,用来把user_id转换成user_name。
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'替换为你从另外一个表查询出来的字段