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.