Hal ini dimungkinkan untuk melakukan ini semua dalam SQL dengan menggunakan fungsi REGEXP_SUBSTR dan kueri hierarkis:
with list_of_ids as (
select regexp_substr(a, '[[:digit:]]+',1, 1) as lot1
, nvl( regexp_substr(a, '(-)([[:digit:]]+)',1, 1, 'i', '2')
, regexp_substr(a, '[[:digit:]]+',1, 1)) as lot2
from (select regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) as a
from dual
connect by regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) is not null
)
)
select a.*
from products a
join list_of_ids b
on a.lot between b.lot1 and b.lot2
Namun, saya harus menekankan bahwa menormalkan database Anda dengan benar adalah cara yang harus dilakukan. Solusi ini mungkin tidak dapat diskalakan dengan baik dan melakukan pekerjaan yang sangat tidak perlu.
Ini bekerja seperti ini:
Pisahkan dulu data Anda dengan koma:
SQL> select regexp_substr('1-3,5,10-15,20', '[^,]+', 1, level) as a
2 from dual
3 connect by regexp_substr('1-3,5,10-15,20', '[^,]+', 1, level) is not null
4 ;
A
--------------
1-3
5
10-15
20
Selanjutnya, pisahkan pada tanda hubung untuk memberikan lot minimum dan maksimum untuk digunakan di ANTARA sebelum akhirnya menggabungkannya ke tabel. NVL ada untuk memastikan bahwa selalu ada maksimum.
SQL> select regexp_substr(a, '[[:digit:]]+',1, 1) as lot1
2 , nvl( regexp_substr(a, '(-)([[:digit:]]+)',1, 1, 'i', '2')
3 , regexp_substr(a, '[[:digit:]]+',1, 1)) as lot2
4 from (select regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) as a
5 from dual
6 connect by regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) is not null
7 )
8 ;
LOT1 LOT2
-------------- --------------
1 3
5 5
10 15
20 20
SQL>
Berikut adalah SQL Fiddle yang berfungsi dengan kueri lengkap.