Oracle SQL REGEXP用于查找列之间的值,而不考虑它们的位置



我在一个表中的两个不同列中有以下一组数据。我需要检查BB%值是否在两列之间匹配。

AA13、BB12 CC24 AA34、CC78 BB77AA22、BB33 BB44, CC77

你可以试试这个。但是,它没有考虑在列na中出现多个BBXXX的情况。在这种情况下,比较将仅基于BBXXX在列na中的第一次出现。

with your_table (ColumnA, ColumnB) as (
select 'BB12,AA13,CC24',    'AA13,BB12,CC24' from dual union all
select 'BB99,AA34,CC78',    'AA34,CC78,BB77' from dual union all
select 'AA22,BB33,CC77',    'AA22,BB33,BB44,CC77' from dual union all
select 'AA22,BB33,CC77',    'AA22,BB44,BB33,CC77' from dual union all
select 'AA22,BB33,CC77',    'BB33,AA22,BB44,CC77' from dual
)
select COLUMNA, COLUMNB
from your_table t
where ','||COLUMNB||',' NOT like '%,'||regexp_substr(COLUMNA, 'BB[^,]*', 1, 1)||',%'
;

我相信这将达到目的,并允许COLB中的值位于任何位置。返回第一个"BB"元素不在COLB中。注意第3行有"BB"从原始示例中交换的值以显示顺序无关。

WITH tbl(ID, cola, colb) AS (
SELECT 1, 'BB12,AA13,CC24','AA13,BB12,CC24' FROM dual UNION ALL
SELECT 2, 'BB99,AA34,CC78','AA34,CC78,BB77' FROM dual UNION ALL
SELECT 3, 'AA22,BB33,CC77','AA22,BB44,BB33,CC77' FROM dual
)
SELECT ID, COLA, COLB
FROM tbl T
WHERE NOT REGEXP_LIKE(COLB, REGEXP_SUBSTR(COLA, 'BB[^,]*'));

ID COLA           COLB               
---------- -------------- -------------------
2 BB99,AA34,CC78 AA34,CC78,BB77  

我建议从每个字符串中提取BBxx子字符串,然后比较两者是否相等:

WITH cteData(ColumnA,ColumnB) AS
(SELECT 'BB12,AA13,CC24', 'AA13,BB12,CC24' FROM DUAL UNION ALL
SELECT 'BB99,AA34,CC78', 'AA34,CC78,BB77' FROM DUAL UNION ALL
SELECT 'AA22,BB33,CC77', 'AA22,BB33,BB44,CC77' FROM DUAL)
SELECT COLUMNA,
REGEXP_SUBSTR(COLUMNA, 'BB[^,]+') AS COLA_BB,
COLUMNB,
REGEXP_SUBSTR(COLUMNB, 'BB[^,]+') AS COLB_BB
FROM cteData
WHERE REGEXP_SUBSTR(COLUMNA, 'BB[^,]+') = REGEXP_SUBSTR(COLUMNB, 'BB[^,]+')

dbfiddle这里

最新更新