日期:2014-05-18  浏览次数:20403 次

还是分解字段
表中数据这样:
[fID] [fName] [fFullName]
11 北京 北京
51 四川 四川
5101 成都 四川\成都
510101 锦江区 四川\成都\锦江区
51010101 南光街道 四川\成都\锦江区\南光街道
我希望一个查询出来这样的效果:
[fID] [fName] [fFullName] [省] [市] [县] [乡]
11 北京 北京 北京 NULL NULL NULL
51 四川 四川 四川 NULL NULL NULL
5101 成都 四川\成都 四川 成都 NULL NULL
510101 锦江区 四川\成都\锦江区 四川 成都 锦江区 NULL
51010101 南光街道 四川\成都\锦江区\南光街道 四川 成都 锦江区 南光街道


------解决方案--------------------
SQL code
--> 测试数据
 
declare @tb table ([fID] int,[fName] nvarchar(4),[fFullName] nvarchar(14),[省] nvarchar(2),[市] nvarchar(4),[县] nvarchar(4),[乡] nvarchar(4))
Insert into @tb
 select 11,'北京','北京','','','','' union all 
 select 51,'四川','四川','','','','' union all 
 select 5101,'成都','四川\成都','','','','' union all 
 select 510101,'锦江区','四川\成都\锦江区','','','','' union all 
 select 51010101,'南光街道','四川\成都\锦江区\南光街道','','','',''
  
Select fId,fName,fFullName,
   reverse(parsename(replace(reverse([fFullName]),'\','.'),1)),
   reverse(parsename(replace(reverse([fFullName]),'\','.'),2)),
   reverse(parsename(replace(reverse([fFullName]),'\','.'),3)),
   reverse(parsename(replace(reverse([fFullName]),'\','.'),4))
 from @tb
/*
11    北京    北京    北京    NULL    NULL    NULL
51    四川    四川    四川    NULL    NULL    NULL
5101    成都    四川\成都    四川    成都    NULL    NULL
510101    锦江区    四川\成都\锦江区    四川    成都    锦江区    NULL
51010101    南光街道    四川\成都\锦江区\南光街道    四川    成都    锦江区    南光街道
*/

------解决方案--------------------
SQL code
/*
fId         fName      fFullName                      [省]        [市]        [县]        [乡]
----------- ---------- ------------------------------ ---------- ---------- ---------- ----------
11          北京         北京                             北京         NULL       NULL       NULL
51          四川         四川                             四川         NULL       NULL       NULL
5101        成都         四川\成都                          四川         成都         NULL       NULL
510101      锦江区        四川\成都\锦江区                      四川         成都         锦江区        NULL
51010101    南光街道       四川\成都\锦江区\南光街道                 四川         成都         锦江区        南光街道
*/

------解决方案--------------------
这是“层级编码树”的结构
如果可以确定各级编码的长度,就可以直接用如下的方式得到结果:
SQL code
select
  fid
  ,fname
  ,ffullname
  ,[省] = (select fname from @tb a0 where a0.fid=left(a.id,2))
  ,[市] = (select fname from @tb a0 where a0.fid=left(a.id,4))
  ,[县] = (select fname from @tb a0 where a0.fid=left(a.id,6))
  ,[乡] = (select fname from @tb a0 where a0.fid=left(a.id,8))
from @tb a

------解决方案--------------------
SQL code
set nocount on 
declare @t1 table (fid varchar(20),fname varchar(10),ffullname varchar(100))
insert into @t1 (fid,fname,ffullname) values( '11'       ,     '北京'           ,       '北京' )
insert into @t1 (fid,fname,ffullname) values( '51'    ,        '四川'              ,    '四川' )
insert into @t1 (fid,fname,ffullname) values( '5101'   ,       '成都'               ,   '四川\成都' )
insert into @t1 (fid,fname,ffullname) values( '510101'  ,      '锦江区'             ,   '四川\成都\锦江区' )
insert into @t1 (fid,fname,ffullname) values( '51010101' ,     '南光街道'           ,   '四川\成都\锦江区\南光街道' )

declare @t2 table (fid varchar(20),fname varchar(10),ffullname varchar(100),f1 varchar(20) null,
            f2 varchar(20) null,f3 varch