2014-02-19 124 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

相關問題