oracle 空值处理
有一张表A,有两个字段地区编码,地区名称1北美11加拿大12美国2东亚21中国211东北212西北2111黑龙江现在我要得到这样的一张表:北美|美国|‘---’|‘--’...
有一张表A,有两个字段 地区编码,地区名称
1 北美
11 加拿大
12 美国
2 东亚
21 中国
211东北
212西北
2111 黑龙江
现在我要得到这样的一张表:
北美 | 美国 | ‘---’| ‘--’
北美 | 加拿大 | ‘--- |‘--’
东亚 | 中国 | 东北 | ‘--’
东亚 | 中国 | 西北 | ‘--’
东亚 | 中国 | 东北 | 黑龙江
谢谢啊~
这个是我做的,只能找出 包含值最多的这一项。
请求大家帮我看看,我这个sql怎么改就对了。
如果有更好的处理方法,也请说去思路, 谢谢啦
select b.aname,c.aname,d.aname from
(select ab.areaclcode acode, ab.areaclname aname
from bq_th_bd_areacl ab
where (select length(ab.areaclcode) from dual) = 1) a,
(select ab.areaclcode acode, ab.areaclname aname
from bq_th_bd_areacl ab
where (select length(ab.areaclcode) from dual) = 2) b,
(select ab.areaclcode acode, ab.areaclname aname
from bq_th_bd_areacl ab
where (select length(ab.areaclcode) from dual) = 4) c,
(select ab.areaclcode acode, ab.areaclname aname
from bq_th_bd_areacl ab
where (select length(ab.areaclcode) from dual) = 6) d
where a.acode = substr(b.acode,0,1) and b.acode = substr(c.acode,0,2) and c.acode = substr(d.acode,0,4) 展开
1 北美
11 加拿大
12 美国
2 东亚
21 中国
211东北
212西北
2111 黑龙江
现在我要得到这样的一张表:
北美 | 美国 | ‘---’| ‘--’
北美 | 加拿大 | ‘--- |‘--’
东亚 | 中国 | 东北 | ‘--’
东亚 | 中国 | 西北 | ‘--’
东亚 | 中国 | 东北 | 黑龙江
谢谢啊~
这个是我做的,只能找出 包含值最多的这一项。
请求大家帮我看看,我这个sql怎么改就对了。
如果有更好的处理方法,也请说去思路, 谢谢啦
select b.aname,c.aname,d.aname from
(select ab.areaclcode acode, ab.areaclname aname
from bq_th_bd_areacl ab
where (select length(ab.areaclcode) from dual) = 1) a,
(select ab.areaclcode acode, ab.areaclname aname
from bq_th_bd_areacl ab
where (select length(ab.areaclcode) from dual) = 2) b,
(select ab.areaclcode acode, ab.areaclname aname
from bq_th_bd_areacl ab
where (select length(ab.areaclcode) from dual) = 4) c,
(select ab.areaclcode acode, ab.areaclname aname
from bq_th_bd_areacl ab
where (select length(ab.areaclcode) from dual) = 6) d
where a.acode = substr(b.acode,0,1) and b.acode = substr(c.acode,0,2) and c.acode = substr(d.acode,0,4) 展开
2个回答
展开全部
只有四级么?如果只有四级,可以写死,用同一个表重命名四次做连接,四个表分别取其中一级。但是,你这个东亚 | 中国 | 东北 | ‘--’是不是多了?因为可以关联到“东亚 | 中国 | 东北 | 黑龙江”这条记录,那么东北后边没有的那个,应该不需要吧?
思路就是同一个表四次使用,但是四次分别对应着的是四个子表,一级,二级,三级,四级。
四级是根据areacode这个字段的长度来定的。
然后四张表,前两张做直连,在第二张表的areacode定位第一张表的areacode,得到的值是1,即第二级的编码是以第一级的编码开头的而且长度是2。第三级和第二级做左连接,有数据就连接,没有数据会拼上'--'两个横线。同样编码规则是按照三级以二级开头且长度等于3。四级同样。
这样得到的结果,应该是你要的数据。但是对于"东亚 | 中国 | 东北 | ‘--’"这一行,是无法得到的,因为往下一级,东北是有数据的,所以可以得到。
select t.areaclname ||'|'|| t1.areaclname ||'|'|| nvl(t2.areaclname ,'--')||'|'|| nvl(t3.areaclname ,'--')
from bq_th_bd_areacl t inner join bq_th_bd_areacl t1 on length(t.areaclcode) = 1 and length(t1.areaclcode) = 2 and instr(t1.areaclcode, t.areaclcode) = 1
left join bq_th_bd_areacl t2 on length(t2.areaclcode) = 3 and instr(t2.areaclcode, t1.areaclcode) = 1
left join bq_th_bd_areacl t3 on length(t3.areaclcode) = 4 and instr(t3.areaclcode, t2.areaclcode) = 1
思路就是同一个表四次使用,但是四次分别对应着的是四个子表,一级,二级,三级,四级。
四级是根据areacode这个字段的长度来定的。
然后四张表,前两张做直连,在第二张表的areacode定位第一张表的areacode,得到的值是1,即第二级的编码是以第一级的编码开头的而且长度是2。第三级和第二级做左连接,有数据就连接,没有数据会拼上'--'两个横线。同样编码规则是按照三级以二级开头且长度等于3。四级同样。
这样得到的结果,应该是你要的数据。但是对于"东亚 | 中国 | 东北 | ‘--’"这一行,是无法得到的,因为往下一级,东北是有数据的,所以可以得到。
select t.areaclname ||'|'|| t1.areaclname ||'|'|| nvl(t2.areaclname ,'--')||'|'|| nvl(t3.areaclname ,'--')
from bq_th_bd_areacl t inner join bq_th_bd_areacl t1 on length(t.areaclcode) = 1 and length(t1.areaclcode) = 2 and instr(t1.areaclcode, t.areaclcode) = 1
left join bq_th_bd_areacl t2 on length(t2.areaclcode) = 3 and instr(t2.areaclcode, t1.areaclcode) = 1
left join bq_th_bd_areacl t3 on length(t3.areaclcode) = 4 and instr(t3.areaclcode, t2.areaclcode) = 1
更多追问追答
追问
东亚 | 中国 | 东北 | ‘--’ 这个是多余的,
我用‘|’是来分割字段的,
只能显示两列,后两列显示不出来。
我现在在试着改呢。
出来那种效果了, 非常感谢您的答案~
追答
呵呵,能查出来就好。但是这个语法比较死,只能处理四级的查询。
多了就不行了。
2011-08-04
展开全部
mark
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询