Có thể thực hiện tất cả điều này trong SQL bằng cách sử dụng hàm REGEXP_SUBSTR và các truy vấn phân cấp:
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
Tuy nhiên, tôi phải nhấn mạnh rằng chuẩn hóa cơ sở dữ liệu của bạn đúng cách là cách nên làm. Giải pháp này có thể mở rộng quy mô không tốt và thực hiện một lượng công việc cực kỳ không cần thiết.
Nó hoạt động như thế này:
Trước tiên, hãy tách dữ liệu của bạn trên dấu phẩy:
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
Tiếp theo, chia nó trên dấu gạch nối để cung cấp số lượng tối thiểu và tối đa để sử dụng trong GIỮA trước khi cuối cùng nhập nó vào bảng. NVL ở đó để đảm bảo rằng luôn có mức tối đa.
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>
Đây là SQL Fiddle đang hoạt động với truy vấn đầy đủ.