菜鸟请教各位老鸟一问题。。表已建好,有两列
create table TABLE_A  
(codeid VARCHAR2(20) not null,
  name VARCHAR2(80));
insert into TABLE_A  (codeid, name)
values ('340000', '安徽省');
insert into TABLE_A  (codeid, name)
values ('110000', '北京市’);


。[省的后四位是0,市的后两位是0]
像上面那样把全国的每个省,每个市,每个区县都添加到表中。
要求:先1按省排序,再2按省市排序,最后3按省市区县排序。
备注:最后一行的结果为 XX省XX市XX县

解决方案 »

  1.   

    最后一句也解……
    这样子
    select * from TABLE_A order by codeid asc
    字符串比较满足:
     先1按省排序,再2按省市排序,最后3按省市区县排序。
      

  2.   

    WITH a 
    AS 
    (
    SELECT '340000' a, '安徽省' b FROM dual
    UNION ALL
    SELECT '341100', '安庆市' FROM dual
    UNION ALL
    SELECT '341101', 'MMM' FROM dual
    UNION ALL
    SELECT '110000', '北京市' FROM dual
    UNION ALL
    SELECT '111200', '东城区' FROM dual
    )
    SELECT substr(max(sys_connect_by_path(b,';')),2)
    FROM 
    (
           select a,b,row_number() OVER(PARTITION BY  SUBSTR(a,1,2) ORDER BY a ) rn from a 
    )
    connect by  prior rn=rn-1 
    start with rn=1 
    group by a
    --result:
    1 北京市
    2 北京市;东城区
    3 安徽省
    4 北京市;安庆市
    5 北京市;东城区;MMM
      

  3.   

    --如果排序有问题,把这个改一下!
    PARTITION BY  SUBSTR(a,1,2)
      

  4.   

    换了一种,不用判断好了!WITH a 
    AS 
    (
    SELECT '340000' a, '安徽省' b FROM dual
    UNION ALL
    SELECT '341100', '安庆市' FROM dual
    UNION ALL
    SELECT '341101', 'MMM' FROM dual
    UNION ALL
    SELECT '341102', 'AAAA' FROM dual
    UNION ALL
    SELECT '110000', '北京市' FROM dual
    UNION ALL
    SELECT '111200', '东城区' FROM dual
    )
    SELECT substr(max(sys_connect_by_path(b,',')),2)
    FROM 
    (
           select a,b,(CASE WHEN INSTR(a,'0000')>0 THEN 1 WHEN INSTR(a,'00')>0 THEN 2 ELSE 3 END) rn ,SUBSTR(a,1,2) aa from a
    )
    connect by  prior rn=rn-1  AND PRIOR aa=aa
    START WITH rn=1
    group by a--考虑到另一种情况...改了一下!请TEST.
    --result:
    北京市
    北京市,东城区
    安徽省
    安徽省,安庆市
    安徽省,安庆市,MMM
    安徽省,安庆市,AAAA
      

  5.   

    还是不行[全国的每个省,市,区县都添加进去的--省,市,县,三级代码]
    要求:先按省排序(全是省),再按省市排序(省市),最后按省市区县(有省市区县)排序。
    备注:最后一行的结果为 XX省XX市XX县
    -------------------
    这个应该要用到
    SELECT CODEID,
           NAME,
           CASE
             WHEN SUBSTR(CODE, 3, 4) = '0000' THEN
              1
             when (SUBSTR(CODE, 3, 2) <> '00' and SUBSTR(CODE, 5, 2) = '00') then
              2
             else
              3
           END 
      FROM TABLE_A

    有哪位高手帮忙完成,,
      

  6.   

    给你个SQL参考:select a.*,LEVEL, SYS_CONNECT_BY_PATH(areaname, ' ') from(
    select rtrim(areaid,'0') areaid,areaname,substr(rtrim(areaid,'0'),1,length(rtrim(areaid,'0'))-2) pid from tab_area
    ) a
    start with pid is null connect by prior areaid=pid
    order by level,areaid;
      

  7.   

    select case when substr(a.codeid,-4)='0000' then 
                     a.name||';'
    when substr(a.codeid,-2)='00' then 
        b.name||';'||a.name ||';'
    when substr(a.codeid,-2)<>'00' then 
        b.name||';'||c.name||';'||a.name ||';'
     end
    from table_a a,
         table_a b,  --省
      table_a c  --市
    where  b.codeid=substr(a.codeid,1,2)||'0000' and c.codeid=substr(a.codeid,1,4)||'00'
    and b.codeid=substr(c.codeid,1,2)||'0000'
    order by a.codeid
      

  8.   

    补充一下:修改一下order by 条件 还可以变化显示方式,如 order by length(selct结果字段)