मेरे पास '8|12|53|123|97' जैसे रिकॉर्ड नीचे हैं और मुझे 8 से 97 के बीच मानों की सीमा खोजने की जरूरत है, ताकि मुझे संख्या 8 और 97 की आवश्यकता हो।

0
Raja sekar 19 पद 2019, 12:25

1 उत्तर

यहां एक समाधान है जो किसी भी स्ट्रिंग के लिए काम करेगा जिसमें कम से कम एक पाइप हो।

with cte as (
  select '8|12|53|123|97' str from dual
  )
, rng as (  
select to_number(substr(str, 1, instr(str, '|')-1)) as token_1
      ,to_number(substr(str, instr(str, '|', -1)+1)) as token_2
from cte )
select token_1 + level - 1 as tkn
from rng
connect by level <= (token_2 - token_1) + 1
/

पहला सबक्वेरी सिर्फ आपका टेस्ट डेटा है। दूसरी सबक्वेरी स्ट्रिंग में पहली संख्या (token_1) और अंतिम संख्या (token_2) की पहचान करती है। यह substr() और instr() का उपयोग सिर्फ इसलिए करता है क्योंकि वे रेगेक्स से तेज़ हैं। instr() ऋणात्मक ऑफसेट के साथ खोज तर्क का अंतिम अवसर पाता है।

मुख्य क्वेरी rng सबक्वेरी की सीमा से कई संख्याएँ उत्पन्न करती है। सुनिश्चित नहीं है कि यह आपकी आवश्यकता में है ("के बीच मूल्यों की श्रेणी" से आपका क्या मतलब है इस पर निर्भर करता है)।

चूंकि यह मॉडल प्रथम सामान्य फ़ॉर्म में नहीं है, इसलिए आप डेटा गुणवत्ता संबंधी समस्याओं के संपर्क में हैं। यदि पहले या अंतिम टोकन सांख्यिक नहीं हैं, या केवल एक टोकन है या विभाजक पाइप नहीं है, तो क्वेरी परिणाम नहीं देगी।

0
APC 19 पद 2019, 10:18