2017-11-11 120 views
0

我有像varchar這樣的值'M000000000009',我期待這個值的結果增加1,'M000000000010'。 我該怎麼做?如何在oracle中添加一個字符串

select 'M000000000009'+ 1 from dual 
+2

最簡單的方法是修復你的表模式,所以你有*前綴*列和*數字*列。另外,您需要修正以正確的方式將您的frankenvalue輸出爲*格式*這兩個值的查詢。 – Bohemian

回答

3

你可以試試這個選擇:

SELECT SUBSTR('M000000000009', 1, 1) || LPAD((TO_NUMBER(SUBSTR('M000000000009',2)) + 1), 12, '0') NEW_SERIAL 
FROM DUAL 
0

蠻力,而不是漂亮的

select 
     substr(str,1,1) || substr(concat('0000000000000' , cast(substr(str,2,13) as int) + 1),-12) x 
    from (
    select 
     'M000000000009' as str 
    from dual 
    ) 

注:會失敗,如果第二到該字符串的最後一部分不強制轉換爲整數

1

任何時候我們發現自己在問一個問題,比如「如何將1添加到字符串?」我們知道我們已經犯了設計錯誤。這就像問「這些領帶哪個更適合這個馬球領?」這只是錯誤的。

'M000000000009'就是所謂的「智能鑰匙」。也就是說,一列實際上包含兩個或更多個部分。這是打破第一個正常形式,因爲它不是原子的(儘管原子性是tricky to define)。

但這不是一些抽象的設計要點:智能鑰匙很笨。正如你所發現的,他們很難與之合作。在編寫查詢或填充記錄時,我們不可避免地會發現自己正在運用SUBSTR和INSTR。

更好的實現方法是將智能鑰匙的原子組件作爲單獨的列存儲,並在將它們呈現給用戶時將它們連接起來。這仍然有點痛苦,但甲骨文通過引入高度整潔的虛擬列來消除了11g中的煩勞。這些是基於規則的列,從其他列自動填充。我們可以在虛擬列上建立索引甚至限制。

因此,在您的示例中,您有一個包含字母前綴和單調遞增數字的密鑰。你可以這樣實現它:

create table t23 
    (cat_code varchar2(1) not null 
    , cat_number number(11,0) not null 
    , catalogue_no varchar2(12) 
     as (cast(cat_code||lpad(to_char(cat_number), 11, '0') as varchar2(12))) virtual 
    , constraint t23_pk primary key (catalogue_no) 
) 

LiveSQL demo script.

的數字部分cat_number是一個數字,所以你可以填充它像任何其他號碼 - 算術,用序列或 - 因爲12C - 作爲IDENTITY列:

create table t23 
    (cat_code varchar2(1) not null 
    , cat_number number generated always as identity 
    , catalogue_no varchar2(12) as (cast(cat_code||lpad(to_char(cat_number), 11, '0') as varchar2(12))) virtual 
    , constraint t23_pk primary key (catalogue_no) 
) 
/
相關問題