将"地址分割"列拆分为SQL视图中的单独列

Jam*_*mie 5 sql database sql-server sql-server-2005

我在表中有一个Address列,我需要在SQL Server 2005的视图中拆分成多列.我需要在换行符chr(10)上拆分列,并且可能有1到4行列中的(0到3行换行).以下是我需要做的几个例子.实现这一目标的最简单方法是什么?

Examples:

Address                 Address1      Address2       Address3            Address4
------------        =   -----------   -----------    -----------------   ---------
My Company              My Company     123 Main St.  Somewhere,NY 12345  
123 Main St.         
Somewhere,NY 12345

Address                 Address1       Address2      Address3      Address4
------------        =   ------------   ----------    -----------   ---------
123 Main St.            123 Main St.
Run Code Online (Sandbox Code Playgroud)

SQL*_*ace 3

这将使用 parsename 函数分割地址,并将其与 COALESCE 结合起来,以在正确的列中获取正确的信息

如果你的行数超过 4 行,此方法将不起作用

编辑:添加代码以反转顺序

    create table #test (address varchar(1000))

    --test data
    insert #test values('My Company
    123 Main St.         
    Somewhere,NY 12345')

    insert #test values('My Company2
    666 Main St.  
    Bla Bla       
    Somewhere,NY 12345')

    insert #test values('My Company2')

    --split happens here
                            select
replace(parsename(address,ParseLen +1),'^','') as Address1,
replace(parsename(address,ParseLen ),'^','') as Address2,
replace(parsename(address,ParseLen -1),'^','') as Address3,
replace(parsename(address,ParseLen -2),'^','') as Address4
from(
select case  ascii(right(address,1)) when 10 then
replace(replace(left(address,(len(address)-1)),'.','^'),char(10),'.')  
else 
replace(replace(address,'.','^'),char(10),'.') end as address,
case  ascii(right(address,1)) when 10 then
len(replace(replace(address,'.','^'),char(10),'.')) -
len(replace(replace(address,'.','^'),char(10),'')) -1
else
len(replace(replace(address,'.','^'),char(10),'.')) -
len(replace(replace(address,'.','^'),char(10),'')) end as ParseLen
 from #test) x
Run Code Online (Sandbox Code Playgroud)