Saya ingin mencari sel dengan data yang dipisahkan koma dengan kondisi. Misalnya, jika nilai kolom adalah kondisi 'AAA, CCC, BBB dan WHERE IN('AAA','BBB'), saya ingin mencari baris yang sesuai. Apakah ada cara yang berguna untuk mendapatkan hasil berikut di 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
0
1line 30 Desember 2020, 04:02

3 jawaban

Jawaban Terbaik

Daripada menggunakan IN, Anda dapat menggunakan:

SELECT *
FROM   table_name
WHERE  ','||column2||',' LIKE '%,AAA,%'
OR     ','||column2||',' LIKE '%,BBB,%'

Atau, ekspresi kumpulan tabel:

SELECT *
FROM   table_name t
WHERE  EXISTS (
         SELECT 1
         FROM   TABLE(SYS.ODCIVARCHAR2LIST('AAA','BBB'))
         WHERE  ','||t.column2||',' LIKE '%,'||COLUMN_VALUE||',%'
       );

Yang, untuk data sampel:

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;

Kedua keluaran:

COLUMN1 | COLUMN2    
:------ | :----------
data1   | AAA,CCC,BBB
data2   | AAA,CCC    
data3   | BBB,DDD,EEE

db<>fiddle di sini

0
MT0 30 Desember 2020, 11:48

Anda juga dapat menggunakan regexp_substr dengan operator yang ada:

 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)
1
tomash 30 Desember 2020, 06:50

Anda dapat menggunakan cte sebagai sub-kueri pencarian dan menggunakan like sebagai berikut:

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 || ',%'
0
Popeye 30 Desember 2020, 02:41