我正在使用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一樣。但是,由於我目前以某種方式卡住了它,有沒有人有更好更短的方法來做同樣的事情?
ahh,「解決方案」 - beeing卡住了... thx – nurgan