PL/SQL 在 IN 条件下搜索以逗号分隔的单元格数据
PL/SQL Search cell data separated by comma with IN condition
我想搜索条件为逗号分隔数据的单元格。
比如列值为'AAA, CCC, BBB 和WHERE IN('AAA','BBB') 条件,我想搜索对应的行。
有什么有用的方法可以在 Oracle 中得到以下结果吗?
// 1. table data
column1 | column2
data1 | AAA,CCC,BBB
data2 | AAA,CCC
data3 | BBB,DDD,EEE
data4 | EEE,FFF,GGG
// 2. wanted result(WHERE COLUMN2 IN ('AAA', 'BBB'))
column1 | column2
data1 | AAA,CCC,BBB
data2 | AAA,CCC
data3 | BBB,DDD,EEE
您可以使用 cte 作为搜索子查询并使用 like
如下:
With search_params as
(Select 'AAA' as p from dual union all
Select 'BBB' as p from dual)
--
Select distinct t.*
From your_table t
Join search_params s on ',' || t.column2 || ',' like '%,' || s.p || ',%'
您还可以将 regexp_substr 与 exists 运算符一起使用:
select yt.*
from your_table yt
where exists (select regexp_substr(yt.column2, '[^,]+', 1, level)
from dual
where regexp_substr(yt.column2, '[^,]+', 1, level) in ('AAA', 'BBB')
connect by regexp_substr(yt.column2, '[^,]+', 1, level) is not null)
除了使用 IN
,您还可以使用:
SELECT *
FROM table_name
WHERE ','||column2||',' LIKE '%,AAA,%'
OR ','||column2||',' LIKE '%,BBB,%'
或者,table 集合表达式:
SELECT *
FROM table_name t
WHERE EXISTS (
SELECT 1
FROM TABLE(SYS.ODCIVARCHAR2LIST('AAA','BBB'))
WHERE ','||t.column2||',' LIKE '%,'||COLUMN_VALUE||',%'
);
其中,对于示例数据:
CREATE TABLE table_name ( column1, column2 ) AS
SELECT 'data1', 'AAA,CCC,BBB' FROM DUAL UNION ALL
SELECT 'data2', 'AAA,CCC' FROM DUAL UNION ALL
SELECT 'data3', 'BBB,DDD,EEE' FROM DUAL UNION ALL
SELECT 'data4', 'EEE,FFF,GGG' FROM DUAL;
双输出:
COLUMN1 | COLUMN2
:------ | :----------
data1 | AAA,CCC,BBB
data2 | AAA,CCC
data3 | BBB,DDD,EEE
db<>fiddle here
我想搜索条件为逗号分隔数据的单元格。 比如列值为'AAA, CCC, BBB 和WHERE IN('AAA','BBB') 条件,我想搜索对应的行。 有什么有用的方法可以在 Oracle 中得到以下结果吗?
// 1. table data
column1 | column2
data1 | AAA,CCC,BBB
data2 | AAA,CCC
data3 | BBB,DDD,EEE
data4 | EEE,FFF,GGG
// 2. wanted result(WHERE COLUMN2 IN ('AAA', 'BBB'))
column1 | column2
data1 | AAA,CCC,BBB
data2 | AAA,CCC
data3 | BBB,DDD,EEE
您可以使用 cte 作为搜索子查询并使用 like
如下:
With search_params as
(Select 'AAA' as p from dual union all
Select 'BBB' as p from dual)
--
Select distinct t.*
From your_table t
Join search_params s on ',' || t.column2 || ',' like '%,' || s.p || ',%'
您还可以将 regexp_substr 与 exists 运算符一起使用:
select yt.*
from your_table yt
where exists (select regexp_substr(yt.column2, '[^,]+', 1, level)
from dual
where regexp_substr(yt.column2, '[^,]+', 1, level) in ('AAA', 'BBB')
connect by regexp_substr(yt.column2, '[^,]+', 1, level) is not null)
除了使用 IN
,您还可以使用:
SELECT *
FROM table_name
WHERE ','||column2||',' LIKE '%,AAA,%'
OR ','||column2||',' LIKE '%,BBB,%'
或者,table 集合表达式:
SELECT *
FROM table_name t
WHERE EXISTS (
SELECT 1
FROM TABLE(SYS.ODCIVARCHAR2LIST('AAA','BBB'))
WHERE ','||t.column2||',' LIKE '%,'||COLUMN_VALUE||',%'
);
其中,对于示例数据:
CREATE TABLE table_name ( column1, column2 ) AS
SELECT 'data1', 'AAA,CCC,BBB' FROM DUAL UNION ALL
SELECT 'data2', 'AAA,CCC' FROM DUAL UNION ALL
SELECT 'data3', 'BBB,DDD,EEE' FROM DUAL UNION ALL
SELECT 'data4', 'EEE,FFF,GGG' FROM DUAL;
双输出:
COLUMN1 | COLUMN2 :------ | :---------- data1 | AAA,CCC,BBB data2 | AAA,CCC data3 | BBB,DDD,EEE
db<>fiddle here