Oracle SQL REGEXP 用于查找列之间的值,无论它们的位置如何
Oracle SQL REGEXP for finding a value between columns, irrespective of their position
我在 table 的两个不同列中有以下数据集。我需要检查 BB% 值是否在两列之间匹配。
Column A
Column B
BB12,AA13,CC24
AA13,BB12,CC24
BB99,AA34,CC78
AA34,CC78,BB77
AA22,BB33,CC77
AA22,BB33,BB44,CC77
我最初尝试使用以下 REGEXP。但这仅在 A 列中的 BB 值始终位于位置 1 且 B 列中的位置为 2 时才有效。但是我需要一个 REGEXP 来检查第 2 行和第 3 行场景的内容。
REGEXP_SUBSTR(ColumnA, '\w+', 1, 1) <> REGEXP_SUBSTR(ColumnB, '\w+', 1, 2)
你可以试试这个。但是,它没有考虑在列 A 中出现不止一次 BBXXX 的情况。在这种情况下,比较将仅基于 BBXXX 在列 A 中的第一次出现。
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 中的值处于任何位置。 Return COLA 中第一个“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[^,]+')
我在 table 的两个不同列中有以下数据集。我需要检查 BB% 值是否在两列之间匹配。
Column A | Column B |
---|---|
BB12,AA13,CC24 | AA13,BB12,CC24 |
BB99,AA34,CC78 | AA34,CC78,BB77 |
AA22,BB33,CC77 | AA22,BB33,BB44,CC77 |
我最初尝试使用以下 REGEXP。但这仅在 A 列中的 BB 值始终位于位置 1 且 B 列中的位置为 2 时才有效。但是我需要一个 REGEXP 来检查第 2 行和第 3 行场景的内容。
REGEXP_SUBSTR(ColumnA, '\w+', 1, 1) <> REGEXP_SUBSTR(ColumnB, '\w+', 1, 2)
你可以试试这个。但是,它没有考虑在列 A 中出现不止一次 BBXXX 的情况。在这种情况下,比较将仅基于 BBXXX 在列 A 中的第一次出现。
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 中的值处于任何位置。 Return COLA 中第一个“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[^,]+')