如何在oracle中添加一个字符串
问题描述:
我有像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