如下:
ZDFF.LIST.NNNNN.NNNNN.YYYYMM.YYYYMMDD.NNNNN.XX.Z
ZDFF.LIST.NNNNN.NNNNN.YYYYMM.YYYYMMDD.NNNNN.YYYYMMDD.XX.Z
XSXX.NNN.NNNNN.YYYYMMDD.NNNN.dat.NNNN_NN_NNN_YYYYMMDD_NNNNNN.dat.Z能否一句sql查询结果应有4列,如下?YYYYMMDD出现的次数(1次) 
YYYYMMDD出现次数为1的时候 YYYYMMDD第一次出现的 前面的 [.]或者[_]的总次数 
YYYYMMDD出现的次数(2此) 如果只出现一次,则填0
YYYYMMDD出现次数为2的时候 YYYYMMDD第二次出现的 前面的 [.]或者[_]的总次数 如果只出现一次,则填0举例如下:
源  :ZDFF.LIST.NNNNN.NNNNN.YYYYMM.YYYYMMDD.NNNNN.XX.Z
结果:1   5(第一个YYYYMMDD前面的点的出现的次数) 0 0
源  : XSXX.NNN.NNNNN.YYYYMMDD.NNNN.dat.NNNN_NN_NNN_YYYYMMDD_NNNNNN.dat.Z
结果:1   3(第一个YYYYMMDD前面的点的出现的次数)  2  9(第二个YYYYMMDD前面的_出现的次数含点出现的次数)请牛人帮忙想下,谢谢~

解决方案 »

  1.   

    --create table tb (id varchar(66));
    --insert into tb
    --select 'ZDFF.LIST.NNNNN.NNNNN.YYYYMM.YYYYMMDD.NNNNN.XX.Z' from dual union all
    --select 'ZDFF.LIST.NNNNN.NNNNN.YYYYMM.YYYYMMDD.NNNNN.YYYYMMDD.XX.Z'  from dual  union all
    --select 'XSXX.NNN.NNNNN.YYYYMMDD.NNNN.dat.NNNN_NN_NNN_YYYYMMDD_NNNNNN.dat.Z'  from dual ;select 
    trunc((length(id)-length(replace(id,'YYYYMMDD','')))/6) as n1,
    length(substr(id,1,instr(id,'YYYYMMDD')))-length(replace(replace(substr(id,1,instr(id,'YYYYMMDD')),'.',''),'_','')) as n2,
    case when instr(id,'YYYYMMDD',1,2)=0 then 0 else 2 end as n3,
    case when instr(id,'YYYYMMDD',1,2)=0 then 0 
         else length(substr(id,1,instr(id,'YYYYMMDD',1,2)))-length(replace(replace(substr(id,1,instr(id,'YYYYMMDD',1,2)),'.',''),'_','')) end as n4
     from tb
    N1  N2  N3  N4  
    1  5  0  0  
    2  5  2  7  
    2  3  2  9  
      

  2.   

    select 
    case when trunc((length(id)-length(replace(id,'YYYYMMDD','')))/6)=0 then 0 else 1 end as n1,
    length(substr(id,1,instr(id,'YYYYMMDD')))-length(replace(replace(substr(id,1,instr(id,'YYYYMMDD')),'.',''),'_','')) as n2,
    case when instr(id,'YYYYMMDD',1,2)=0 then 0 else 2 end as n3,
    case when instr(id,'YYYYMMDD',1,2)=0 then 0 
         else length(substr(id,1,instr(id,'YYYYMMDD',1,2)))-length(replace(replace(substr(id,1,instr(id,'YYYYMMDD',1,2)),'.',''),'_','')) end as n4
     from tbN1  N2  N3  N4  
    1  5  0  0  
    1  5  2  7  
    1  3  2  9  改下
      

  3.   

    create table t1(id varchar2(3000));
    insert into t1 values('ZDFF.LIST.NNNNN.NNNNN.YYYYMM.YYYYMMDD.NNNNN.XX.Z
    ZDFF.LIST.NNNNN.NNNNN.YYYYMM.YYYYMMDD.NNNNN.YYYYMMDD.XX.Z
    XSXX.NNN.NNNNN.YYYYMMDD.NNNN.dat.NNNN_NN_NNN_YYYYMMDD_NNNNNN.dat.Z');with t2 as(
    select level rn from dual connect by level < 100
    )
    select case when instr(id,'YYYYMMDD',1,rn) != 0
     then length(substr(id,0,instr(id,'YYYYMMDD',1,rn)-1)) - length(replace(substr(id,0,instr(id,'YYYYMMDD',1,rn)-1),'.',''))
      else 0 end from t1,t2
      

  4.   


    SELECT NAME, DECODE(Y_CNT,1,Y_CNT,DECODE(Y_CNT,2,1,0)) AS Y_CNT,
    DECODE(Y_CNT,0,0,D_CNT-(length(S.REMAIN)-length(replace(S.REMAIN,'.','')))/1) AS DR_CNT,
    DECODE(Y_CNT,1,0,Y_CNT) AS YY_CNT,
    DECODE(Y_CNT,1,0,G_CNT-(length(S.REMAIN)-length(replace(S.REMAIN,'_','')))/1+DECODE(Y_CNT,0,0,D_CNT-(length(S.REMAIN)-length(replace(S.REMAIN,'.','')))/1)) AS DG_CNT
    FROM (select t.name,
    (length(t.name)-length(replace(t.name,'YYYYMMDD','')))/8 as Y_cnt ,--计算'YYYYMMDD'出现次数
    SUBSTR(NAME,instr(t.name,'YYYYMMDD',1,(length(t.name)-length(replace(t.name,'YYYYMMDD','')))/8)) AS REMAIN,--计算最后个YYYYMMDD位置之后的字符串
    (length(t.name)-length(replace(t.name,'.','')))/1 AS D_CNT,--计算'.'出现次数
    (length(t.name)-length(replace(t.name,'_','')))/1 AS G_CNT --计算'-'出现次数
    from ss t
    )  S
      

  5.   

    select 
    case when (length(id)-length(replace(id,'YYYYMMDD','')))/8=0 then 0 else 1 end as n1,
    --应该是8不是6
    length(substr(id,1,instr(id,'YYYYMMDD')))-length(replace(replace(substr(id,1,instr(id,'YYYYMMDD')),'.',''),'_','')) as n2,
    case when instr(id,'YYYYMMDD',1,2)=0 then 0 else 2 end as n3,
    case when instr(id,'YYYYMMDD',1,2)=0 then 0 
         else length(substr(id,1,instr(id,'YYYYMMDD',1,2)))-length(replace(replace(substr(id,1,instr(id,'YYYYMMDD',1,2)),'.',''),'_','')) end as n4
     from tb