find_in_set在oracle下的解决方案

比如一张表:

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

你可能感兴趣的:(#,Oracle数据库,oracle,数据库,sql,linux,运维)