2014-02-19 125 views
0

我正在使用Oracle 10g数据库。 该表具有一列CODE,它是主键,并且是一个varchar。 该字段始终格式为“xx xxx xx”,例如“20 965 04”,第一个和第二个数字不相关,最后一个数字为连续数字。查询中的字符串连接,将字符串填充到固定长度

我要做的是,做一个INSERT,其中的关键字的前两个部分保持不变,最后一个部分比这些具体的第一个部分的最高连续数字多一个。

所以,我startet打了一下,我的第一个方法是这样的:

SUBSTR('20 031 03', 0, 7)||(TO_CHAR(TO_NUMBER( 
SUBSTR(
    (SELECT MAX(CODE) 
    FROM table tmk 
    WHERE tmk.CODE LIKE SUBSTR('20 031 03', 0, 6)||'%') 
    , 8, 9)) + 1 
)) 

这种做法已经是不漂亮,但在我看来确定。 但是后来我意识到,当连续数字低于10时,在TO_NUMBER和TO_CHAR之后,它的例子是5而不是05. 因此,如果我有“20 965 04”,那么在此之后我得到的是“ 20 965 5“但我需要”20 965 05“!

所以,我能想到的唯一的办法就是一个case语句检查字符串的长度增加数量,并添加0,如果neccecary后:

SELECT 
CASE (LENGTH(TO_CHAR(TO_NUMBER(SUBSTR(
    (SELECT MAX(CODE) 
    FROM table tmk 
    WHERE tmk.CODE LIKE SUBSTR('20 031 03', 0, 6)||'%') 
    , 8, 9)) + 1 
))) 
WHEN 1 THEN 
SUBSTR('20 031 03', 0, 7)||'0'||(TO_CHAR(TO_NUMBER( 
SUBSTR(
    (SELECT MAX(CODE) 
    FROM table tmk 
    WHERE tmk.CODE LIKE SUBSTR('20 031 03', 0, 6)||'%') 
    , 8, 9)) + 1 
)) 
ELSE 
SUBSTR('20 031 03', 0, 7)||(TO_CHAR(TO_NUMBER( 
SUBSTR(
    (SELECT MAX(CODE) 
    FROM table tmk 
    WHERE tmk.CODE LIKE SUBSTR('20 031 03', 0, 6)||'%') 
    , 8, 9)) + 1 
)) 
END 
FROM dual; 

所以这个工作,但东西就像我见过的最丑陋的SQL一样。但是,由于我目前以某种方式卡住了它,有没有人有更好更短的方法来做同样的事情?

回答

0

TO_CHAR函数有放慢参数,你可以使用的格式:

SUBSTR('20 031 03', 1, 7) || 
TO_CHAR(
    TO_NUMBER( 
    SUBSTR(
    (SELECT MAX(CODE) FROM table tmk WHERE tmk.CODE LIKE SUBSTR('20 031 03', 1, 6) || '%') 
    , 8, 2) + 1 
) 
, 'FM00') 

我改变了你的SUBSTR的参数性能稍微。索引从1开始。并且您想要最后一个两位数。

+0

ahh,“解决方案” - beeing卡住了... thx – nurgan

1

看看LPAD函数。例如,SELECT LPAD(1,2,'0') FROM DUAL将返回01

相关问题