Można to wszystko zrobić w SQL za pomocą funkcji REGEXP_SUBSTR i zapytań hierarchicznych:
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
Muszę jednak podkreślić, że właściwą normalizacją bazy danych jest odpowiednia droga. To rozwiązanie może nie skalować się dobrze i wykonuje bardzo niepotrzebną pracę.
Działa to tak:
Najpierw podziel swoje dane przecinkiem:
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
Następnie podziel go na myślnik, aby zapewnić minimalną i maksymalną partię do wykorzystania w POMIĘDZY, zanim ostatecznie dołączysz go do stołu. NVL jest po to, aby zapewnić, że zawsze jest 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>
Oto działający SQL Fiddle z pełnym zapytaniem.