我有像varchar這樣的值'M000000000009',我期待這個值的結果增加1,'M000000000010'。 我該怎麼做?如何在oracle中添加一個字符串
select 'M000000000009'+ 1 from dual
我有像varchar這樣的值'M000000000009',我期待這個值的結果增加1,'M000000000010'。 我該怎麼做?如何在oracle中添加一個字符串
select 'M000000000009'+ 1 from dual
你可以試試這個選擇:
SELECT SUBSTR('M000000000009', 1, 1) || LPAD((TO_NUMBER(SUBSTR('M000000000009',2)) + 1), 12, '0') NEW_SERIAL
FROM DUAL
蠻力,而不是漂亮的
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添加到字符串?」我們知道我們已經犯了設計錯誤。這就像問「這些領帶哪個更適合這個馬球領?」這只是錯誤的。
'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)
)
的數字部分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)
)
/
最簡單的方法是修復你的表模式,所以你有*前綴*列和*數字*列。另外,您需要修正以正確的方式將您的frankenvalue輸出爲*格式*這兩個值的查詢。 – Bohemian