यह सब SQL में REGEXP_SUBSTR फ़ंक्शन और पदानुक्रमित प्रश्नों के उपयोग द्वारा करना संभव है:
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
हालांकि, मुझे इस बात पर जोर देना चाहिए कि आपके डेटाबेस को सामान्य रूप से सामान्य करना ही रास्ता है। यह समाधान अच्छी तरह से स्केल नहीं कर सकता है और अत्यधिक अनावश्यक मात्रा में काम करता है।
यह इस तरह काम करता है:
पहले अपने डेटा को अल्पविराम पर विभाजित करें:
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
इसके बाद, इसे तालिका में शामिल करने से पहले बीच में उपयोग करने के लिए न्यूनतम और अधिकतम लॉट प्रदान करने के लिए इसे हाइफ़न पर विभाजित करें। एनवीएल यह सुनिश्चित करने के लिए है कि हमेशा अधिकतम हो।
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>
यहाँ पूरी क्वेरी के साथ एक कार्यशील SQL Fiddle है।