Oracle中字符串加1的方法

vxf3dgd4  于 2023-05-16  发布在  Oracle
关注(0)|答案(3)|浏览(388)

我从varchar中得到了一个值,比如'M00000000009',我希望这个值的结果增加1,'M00000000010'。我该怎么做?

select 'M000000000009'+ 1 from dual
vlf7wbxs

vlf7wbxs1#

你可以试试这个选择:

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

mgdq6dx12#

任何时候我们发现自己在问一个问题,比如“我如何给一个字符串加1?”“我们知道我们犯了一个设计错误。就像在问“哪条领带更配这件波罗衫?“这是不对的。
'M000000000009'是所谓的“智能密钥”。即,实际上包括两个或更多个部分的一个柱。这打破了第一范式,因为它不是原子的(尽管原子性很难定义)。
但这不是抽象的设计要点:智能钥匙是愚蠢的。他们很难相处,正如你所发现的。在编写查询或填充记录时,我们不可避免地会使用SUBSTR和INSTR。
更好的实现方式是将智能密钥的原子组件存储为单独的列,并在向用户显示它们时将它们连接起来。这仍然是一个有点痛苦,但甲骨文删除了pfaffing约在11 g与引进高度整洁的虚拟列。这些列是基于规则的列,由其他列自动填充。我们可以在虚拟列上构建索引甚至约束。
所以在你的例子中,你有一个键,它包括一个字母前缀和一个单调递增的数字。你可以这样实现它:

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是一个数字,因此您可以将其填充为任何其他数字-通过算术,使用序列或-自12 c起-作为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)
 )
/
jqjz2hbq

jqjz2hbq3#

蛮力和不漂亮

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
     )

如果字符串的倒数第二个部分没有转换为整数,则会失败

相关问题