Gran juego de datos con comparación de datos de dos cadenas en la base de datos ORACLE

Los dos valores de campo de la base de datos de Oracle son cadenas de caracteres separados por comas, por ejemplo: el valor del campo A es "1,2,3,5" y el valor del campo B es "2".
Quiero obtener la intersección (mismo valor) 2 de dos campos y obtener la diferencia (valor de diferencia) 1,3,5 de dos campos.

1. La declaración sql final implementada

1. Obtenga la intersección (mismo valor):

select regexp_substr(id, '[^,]+', 1, rownum) id
from (select '1,2,3,5' id from dual)
connect by rownum <= length(regexp_replace(id, '[^,]+')) +1
intersect -- 取交集
select regexp_substr(id, '[^,]+', 1, rownum) id
from (select '2' id from dual)
connect by rownum <= length(regexp_replace(id, '[^,]+')) +1;
/*结果:
2
*/

2. Obtenga el conjunto de diferencias (valor de diferencia):

select regexp_substr(id, '[^,]+', 1, rownum) id
from (select '1,2,3,5' id from dual)
connect by rownum <= length(regexp_replace(id, '[^,]+')) +1
minus --取差集
select regexp_substr(id, '[^,]+', 1, rownum) id
from (select '2' id from dual)
connect by rownum <= length(regexp_replace(id, '[^,]+')) +1;
/*结果:
1
3
5
*/

2. Instrucciones para el uso de las funciones utilizadas en el proceso de implementación

1. La expresión regular regexp_substr
divide la cadena y el formato de la función es el siguiente:

function regexp_substr(strstr, pattern [,position] [,occurrence] [,modifier] [subexpression])
__srcstr:需要进行正则处理的字符串
__pattern:进行匹配的正则表达式
__position:可选参数,表示起始位置,从第几个字符开始正则表达式匹配(默认为1)
__occurrence:可选参数,标识第几个匹配组,默认为1
__modifier:可选参数,表示模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)

Ejemplo de uso:

select
regexp_substr('1,2,3,5','[^,]+') AS t1,
regexp_substr('1,2,3,5','[^,]+',1,2) AS t2,
regexp_substr('1,2,3,5','[^,]+',1,3) AS t3,
regexp_substr('1,2,3,5','[^,]+',1,4) AS t4,
regexp_substr('1,2,3,5','[^,]+',2) AS t5,
regexp_substr('1,2,3,5','[^,]+',2,1) AS t6,
regexp_substr('1,2,3,5','[^,]+',2,2) AS t7
from dual;
/*结果:
1    2    3    5    2    2    3
*/

2, regexp_replace

Use expresiones regulares para hacer coincidir y reemplazar, el formato de la función es el siguiente:

function regexp_substr(srcstr, pattern [,replacestr] [,position] [,occurrence] [,modifier])
__srcstr:需要进行正则处理的字符串
__pattern:进行匹配的正则表达式
__replacestr:可选参数,替换的字符串,默认为空字符串
__position:可选参数,表示起始位置,从第几个字符开始正则表达式匹配(默认为1)
__occurrence:可选参数,标识第几个匹配组,默认为1
__modifier:可选参数,表示模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)

Ejemplo de uso:

select
regexp_replace('1,2,3,5','5','4') t1,
regexp_replace('1,2,3,5','2|3',4) t2,
regexp_replace('1,2,3,5','[^,]+') t3,
regexp_replace('1,2,3,5','[^,]+','') t4,
regexp_replace('1,2,3,5','[^,]+','*') t5
from dual;
/*结果:
1,2,3,4    1,4,4,5    ,,,    ,,,    *,*,*,*
*/

3, conectar por

(1) connect by se usa solo y devuelve varias filas de resultados

select rownum from dual connect by rownum < 5;
/*结果:
1
2
3
4
*/

(2) Generalmente, la consulta jerárquica de SQL se realiza mediante la cláusula start with . . . connect by . . .

select
id,
name,
sys_connect_by_path(id,'\') idpath,
sys_connect_by_path(name, '\') namepath
from (
select 1 id, '广东' name, 0 pid from dual
union
select 2 id, '广州' name , 1 pid from dual
union
select 3 id, '深圳' name , 1 pid from dual
)
start with pid = 0
connect by prior id = pid;
/*结果:
1    广东    \1    \广东
2    广州    \1\2    \广东\广州
3    深圳    \1\3    \广东\深圳
*/

3. Resumen

Del uso de la función anterior, podemos ver que la siguiente declaración puede convertir la cadena "1,2,3,5" en 4 filas de registros

select regexp_substr(id, '[^,]+', 1, rownum) id
from (select '1,2,3,5' id from dual)
connect by rownum <= length(regexp_replace(id, '[^,]+')) +1

Luego use operadores de conjunto (UNIÓN/UNIÓN TODO unión, INTERSECCIÓN intersección, MENOS diferencia) en los 2 resultados para el procesamiento final.

Supongo que te gusta

Origin blog.csdn.net/s_unbo/article/details/132189537
Recomendado
Clasificación