आप पुनरावर्ती सबक्वेरी फैक्टरिंग इस्तेमाल कर सकते हैं (पुनरावर्ती CTE):
with s (street_address, line, part_address, remaining) as (
select street_address, 0 as line,
null as part_address, street_address as remaining
from address
union all
select street_address, line + 1 as line,
case when length(remaining) <= 40 then remaining else
substr(remaining, 1, instr(substr(remaining, 1, 40), ' ', -1, 1)) end
as part_address,
case when length(remaining) <= 40 then null else
substr(remaining, instr(substr(remaining, 1, 40), ' ', -1, 1) + 1) end
as remaining
from s
)
cycle remaining set is_cycle to 'Y' default 'N'
select line, part_address
from s
where part_address is not null
order by street_address, line;
कौन सा बुद्धि एच आपका डेटा देता है:
LINE PART_ADDRESS
---------- ----------------------------------------
1 152 Main st North Pole Factory 44, near
2 the rear entrance cross the street and
3 turn left and keep walking straight.
SQL Fiddle demo दो पते के साथ।
आप उन आंशिक मानों को कॉलम में भी परिवर्तित कर सकते हैं, जो मुझे लगता है कि आपका अंतिम लक्ष्य है, उदा। एक दृश्य के रूप में:
create or replace view v_address as
with cte (street_address, line, part_address, remaining) as (
select street_address, 0 as line,
null as part_address, street_address as remaining
from address
union all
select street_address, line + 1 as line,
case when length(remaining) <= 40 then remaining else
substr(remaining, 1, instr(substr(remaining, 1, 40), ' ', -1, 1)) end
as part_address,
case when length(remaining) <= 40 then null else
substr(remaining, instr(substr(remaining, 1, 40), ' ', -1, 1) + 1) end
as remaining
from cte
)
cycle remaining set is_cycle to 'Y' default 'N'
select street_address,
cast (max(case when line = 1 then part_address end) as varchar2(40))
as address_1,
cast (max(case when line = 2 then part_address end) as varchar2(40))
as address_2,
cast (max(case when line = 3 then part_address end) as varchar2(40))
as address_3
from cte
where part_address is not null
group by street_address;
Another SQL Fiddle।
यह ध्यान देने योग्य हो सकता है कि street_address
लंबाई 120 वर्णों के करीब हो जाती है, तो यह 3 40-चार ब्लॉक में अच्छी तरह से फिट नहीं हो सकती है - आप अगले 'रेखा' में लिपटे शब्द की लंबाई के आधार पर कुछ वर्ण खो देते हैं । यह दृष्टिकोण 3 से अधिक लाइनों को उत्पन्न करेगा, लेकिन दृश्य केवल पहले तीन का उपयोग कर रहा है, ताकि आप पते का अंत खो सकें। आप फ़ील्ड को अधिक लंबा बनाना चाहते हैं, या address_4
उन स्थितियों के लिए ...
आप इन कॉलम कहां दिखाएंगे? आप इसे एप्लिकेशन स्तर पर क्यों विभाजित नहीं करते? – bjan