比如一张表:
artile (id,type,content);
# type:1表示文艺类,2表示小说类,3表示传记,4表示传说,等等5,6,7,8
表数据:
id | type | content |
---|---|---|
1 | 3,1 | dfasdfasdf |
2 | 1,3,6,8 | dfasdf |
3 | 6,8,9 | add |
现在要找出3传记类的artile记录
mysql:
select * from artile where find_in_set('3',type);
oralce 语句实现:
select * from artile da where instr(','||type||',',',3,')<>0;
原理:
将1,3,6,8转为 ,1,3,6,8,然后找出 ,3,的位置
将3,1转为 ,3,1,然后找出 ,3,的位置
则<>0的即为存在,返回记录)
用自定义一个find_in_set的oracle function 来解决:
CREATE OR REPLACE FUNCTION find_in_set(
str IN VARCHAR2,
strlist IN VARCHAR2
) RETURN NUMBER
IS
pos NUMBER;
BEGIN
SELECT INSTR(',' || strlist || ',', ',' || str || ',') INTO pos FROM DUAL;
RETURN pos;
END;
/
解释:
这个函数接受两个字符串参数:
str - 要查找的字符串
strlist - 字符串列表,以逗号分隔
函数使用INSTR和双逗号进行匹配查找,返回str在strlist中的位置(从1开始)。
如果未找到,返回0。
使用示例:
SELECT find_in_set('b','a,b,c,d') FROM DUAL; -- 返回 2
SELECT find_in_set('x','a,b,c,d') FROM DUAL; -- 返回 0
则:
select * from artile where find_in_set('3',type)<>0;
mysql可接受0或其它number做为where 条件,oracle只接受表达式做为where 条件。
You have to grow up, you can live anywhere