Bạn có thể sử dụng đệ quy subquery bao thanh toán (CTE đệ quy):
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;
Sở thích nào h dữ liệu của bạn cho:
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 với hai địa chỉ.
Bạn cũng có thể chuyển đổi các giá trị một phần thành các cột mà tôi nghĩ là mục tiêu cuối cùng của bạn, ví dụ: dưới dạng xem:
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. Có thể cần lưu ý rằng nếu chiều dài street_address
gần 120 ký tự, nó có thể không vừa gọn gàng thành 3 khối 40 ký tự - bạn sẽ mất một số ký tự tùy thuộc vào độ dài của từ được bao bọc cho 'dòng' kế tiếp . Cách tiếp cận này sẽ tạo ra nhiều hơn 3 dòng, nhưng chế độ xem chỉ sử dụng ba dòng đầu tiên, vì vậy bạn có thể mất phần cuối của địa chỉ. Bạn có thể muốn tạo các trường dài hơn hoặc có address_4
cho các trường hợp đó ...
Bạn sẽ hiển thị các cột này ở đâu? Tại sao bạn không chia nó ở cấp ứng dụng? – bjan