"CON-2008-08-05-351" 
上面的字符串为文件编号,以"CON-"+"当前日期-"+"三位编码"作为命名格式,最后三位是顺延的自动编号。 
表里已经有编码,要判断,编号的命名规则为:如果今天没有文件,那就从001开始,如果今天有文件进表,则最后三位自增1
请问,如何用一个语句实现? 
谢谢! 

解决方案 »

  1.   

    select 'CON-'+convert(char(10),getdate(),120)+'-'
    + right(('000'+convert(varchar(3),convert(numeric,tb.bm) +1)),3)
      

  2.   

    select 'CON-'+convert(char(10),getdate(),120)+'-' 
    + right(('000'+convert(varchar(3),convert(numeric,tb.bm) +1)),3)红色部分是oracle提示missing expression,如何处理?
      

  3.   

    create table YourTableName
    (
    t_id char(18)
    )insert into YourTableName values('CON-2008-07-07-001');
    insert into YourTableName values('CON-2008-08-08-001');
    insert into YourTableName values('CON-2008-08-05-001');
    select 'CON-'||TO_char(sysdate,'YYYY-MM-DD')||'-'
    ||decode(sign(count(*)),0,'001',trim(to_char(to_number(substr(max(t_id),16,3))+1,'000')))
    from YourTableName
    where substr(t_id,5,10) = to_char(sysdate,'YYYY-MM-DD');--结果:
    CON-2008-08-05-002select 'CON-'||TO_char(sysdate-1,'YYYY-MM-DD')||'-'
    ||decode(sign(count(*)),0,'001',trim(to_char(to_number(substr(max(t_id),16,3))+1,'000')))
    from YourTableName
    where substr(t_id,5,10) = to_char(sysdate-1,'YYYY-MM-DD');--结果:
    CON-2008-08-04-001
      

  4.   

    或者也可以写成:select 'CON-'||TO_char(sysdate,'YYYY-MM-DD')||'-'||decode(sign(count(*)),0,'001',lpad(to_number(substr(max(t_id),16,3))+1,3,'0'))
    from YourTableName
    where substr(t_id,5,10) = to_char(sysdate,'YYYY-MM-DD')
      

  5.   


    如下方法效率更高:
    SELECT 'CON-' || TO_CHAR(SYSDATE, 'YYYY-MM-DD') || '-' ||
           DECODE(SIGN(COUNT(1)),
                  0,
                  '001',
                  LPAD(TO_NUMBER(SUBSTR(MAX(T_ID), 16, 3)) + 1, 3, '0')) SID
      FROM YOURTABLENAME
     WHERE T_ID LIKE 'CON-' || TO_CHAR(SYSDATE, 'YYYY-MM-DD') || '-%';
      

  6.   

    4楼、5楼相当厉害哦,功能实现,非常感谢。
    请教:偶写到复杂的sql语句就荤菜,有没有什么资料供学习呢?谢谢!
      

  7.   

    可以在网上搜一些介绍Oracle函数(统计函数、分析函数等)的资料看看,可能会有帮助。另外就是多写多练了,不懂就问。有时间了,在论坛(csdn,itpub,cnoug等都不错)多转转,也会有很多收获。