日期:2014-05-17 浏览次数:20374 次
DECLARE @TABLE TABLE ( [KEY] VARCHAR(11), CODE VARCHAR(11), V VARCHAR(11) ) INSERT @TABLE SELECT '101', 'NULL', 0 UNION ALL SELECT 10101 ,NULL, 0 UNION ALL SELECT 102, 'B102', 0 UNION ALL SELECT 10201 ,'B10201' ,1 UNION ALL SELECT 1020101, 'B1020101' ,1 UNION ALL SELECT 102010101 , NULL, 1 UNION ALL SELECT 1020102 ,'B1020102', 1 UNION ALL SELECT 102010201, NULL, 1 UNION ALL SELECT 1020103 ,'B1020103', 0 UNION ALL SELECT 102010301,' B102010301', 1 SELECT *,reverse( SUBSTRING( reverse([key]),charindex('0', reverse([key]))+1,100)) LASTCHARINDEX FROM @TABLE
------解决方案--------------------
看了一下数据,我是这样想的初始化的最低都是3位也就是101,102,103,并且每次增长后都是后面添加2位。
首先判断 对应值是否为空
101 NULL
10101 NULL
102 B102
10201 B10201
1020101 B1020101
102010101 NULL
1020102 B1020102
102010201 NULL
1020103 B1020103
102010301 B102010301
102010302 NULL
找到为空的之后,将字符串减少两位,判断是否有包含的,如果有包含的就继续再减两位,直到至少有3位
我是这样理解的。
------解决方案--------------------
楼主应该多多想想别人怎么作的。
其实这么排,就是在原来的数据前面加上N个空格或者制表符。
这里的数据非常有规律,key的长度除以2就是它所在的层次。
加上N个空格或者制表符形成了新的key的数据,直接绑定一下就出来了。