Acerca de la función de uso de Oracle find_in_set

la cubierta

Enlace original: sobre Oracle usando la función find_in_set | Elvin

1. Descripción general de la función find_in_set

find_in_set英文逗号La función puede recuperar el valor (cadena) separado por un determinado elemento en la tabla de datos .

find_in_set(str, strlist), str: la cadena a consultar; strlist: 英文逗号la cadena separada por

¿Diferente a MySQL?

Mysql viene con la función find_in_set, que se puede usar directamente; Oracle no tiene esta función, por lo que debemos crear manualmente la función find_in_set

2. Cómo consultar datos con la función find_in_set

Como se muestra en la figura, hay una columna llamada version_type en la tabla, y sus valores están compuestos por (version_type:1,2,3) cadenas separadas por comas en inglés.

// 在mysql中,我们可以使用find_in_set函数进行精准搜索,如下

select *  from test where find_in_set('1',version_type);

// 这条语句可以查询出[列version_type]包含1的数据行

¿Por qué no usar en o como?

La razón para no usar in: porque al usar in, el valor de la columna de version_type debe ser igual a 1 para consultar los datos;

La razón para no usar like: si usa like, su método de coincidencia es más extenso. En la búsqueda, siempre que se incluya este carácter, se devolverá. Necesitamos obtener el valor de 1 con precisión. Like pondrá 1 en 11, 21, 111, etc. Todos los valores coinciden, por lo que no puede ser como

función find_in_set

Solo puede buscar valores específicos separados por comas, lo que es más preciso que me gusta, y debe tener la forma de 1 o 2 o 3, por lo que la función find_in_set es más adecuada cuando necesita obtener un valor que contenga 1.

3. Cree la función find_in_set en Oracle

CREATE OR REPLACE FUNCTION FIND_IN_SET(piv_str1 varchar2,  piv_str2 varchar2,  p_sep varchar2 := ',')

El valor predeterminado está separado por comas y también se puede reemplazar por otros caracteres. como:p_sep varchar2 := '|'

⚠️: 如果是换成其它字符隔开,则查询时需要传入隔开的字符,详细请看Cómo usar Oracle

El sql para crear la función es el siguiente:

CREATE OR REPLACE FUNCTION FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',')

RETURN NUMBER IS      
  l_idx    number:=0; -- 用于计算piv_str2中分隔符的位置  
  str      varchar2(500);  -- 根据分隔符截取的子字符串  
  piv_str  varchar2(500) := piv_str2; -- 将piv_str2赋值给piv_str  
  res      number:=0; -- 返回结果  
  loopIndex number:=0;

BEGIN  

-- 如果piv_str中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1  
IF instr(piv_str, p_sep, 1) = 0 THEN  

   IF piv_str = piv_str1 THEN   
      res:= 1;  
   END IF;  

ELSE  

-- 循环按分隔符截取piv_str  
LOOP  
    l_idx := instr(piv_str,p_sep);  
     loopIndex:=loopIndex+1;

-- 当piv_str中还有分隔符时  
      IF l_idx > 0 THEN  

   -- 截取第一个分隔符前的字段str  
         str:= substr(piv_str,1,l_idx-1);  

   -- 判断 str 和piv_str1 是否相等,相等 res=1 并结束循环判断  
         IF str = piv_str1 THEN   
           res:= loopIndex;  
           EXIT;  

         END IF;  
        piv_str := substr(piv_str,l_idx+length(p_sep));  

      ELSE  

   -- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1  
        IF piv_str = piv_str1 THEN   
           res:= loopIndex;  
        END IF;  

        -- 无论最后是否相等,都跳出循环  
        EXIT;  
      END IF;  

END LOOP;  

-- 结束循环  
END IF;  

-- 返回res  
RETURN res;  
END FIND_IN_SET;

4. Cómo usar

Los datos se muestran de la siguiente manera:

1. En MySQL

El método de uso es el siguiente:

select *  from test where find_in_set('2',version_type);

// 查询列VERSION_TYPE包含2的数据行
// 查询结果为2行

2. En oráculo

El método de uso es el siguiente:

select find_in_set('1','1,2,3,4')  from test
select * from test where find_in_set('1',version_type) > 0
  
// 查询列VERSION_TYPE包含1的数据行
// 查询结果为3行

Si la función usa otros delimitadores, el delimitador se debe pasar de la siguiente manera:

select * from test where find_in_set('1',version_type,'|') > 0
  
// 查询列VERSION_TYPE包含1的数据行(数据由”|“分隔)
// 查询结果为3行

5. Enlaces de referencia

función de oráculo FIND_IN_SET

Uso de la función find_in_set() en mysql


¡Más conocimiento se está actualizando continuamente!


declaración

La fuente del texto original se indica en la parte de referencia, y la fuente del texto original se puede obtener en el enlace de referencia del artículo.

Si el contenido del artículo involucra los derechos de autor originales, comuníquese con [email protected] por correo electrónico y los artículos o el contenido relacionados se cambiarán o cancelarán a tiempo.

Supongo que te gusta

Origin blog.csdn.net/weixin_42464282/article/details/130990306
Recomendado
Clasificación