我从varchar中得到了一个值,比如'M00000000009',我希望这个值的结果增加1,'M00000000010'。我该怎么做?
select 'M000000000009'+ 1 from dual
vlf7wbxs1#
你可以试试这个选择:
SELECT SUBSTR('M000000000009', 1, 1) || LPAD((TO_NUMBER(SUBSTR('M000000000009',2)) + 1), 12, '0') NEW_SERIAL FROM DUAL
mgdq6dx12#
任何时候我们发现自己在问一个问题,比如“我如何给一个字符串加1?”“我们知道我们犯了一个设计错误。就像在问“哪条领带更配这件波罗衫?“这是不对的。'M000000000009'是所谓的“智能密钥”。即,实际上包括两个或更多个部分的一个柱。这打破了第一范式,因为它不是原子的(尽管原子性很难定义)。但这不是抽象的设计要点:智能钥匙是愚蠢的。他们很难相处,正如你所发现的。在编写查询或填充记录时,我们不可避免地会使用SUBSTR和INSTR。更好的实现方式是将智能密钥的原子组件存储为单独的列,并在向用户显示它们时将它们连接起来。这仍然是一个有点痛苦,但甲骨文删除了pfaffing约在11 g与引进高度整洁的虚拟列。这些列是基于规则的列,由其他列自动填充。我们可以在虚拟列上构建索引甚至约束。所以在你的例子中,你有一个键,它包括一个字母前缀和一个单调递增的数字。你可以这样实现它:
'M000000000009'
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列:
cat_number
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) ) /
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 )
如果字符串的倒数第二个部分没有转换为整数,则会失败
3条答案
按热度按时间vlf7wbxs1#
你可以试试这个选择:
mgdq6dx12#
任何时候我们发现自己在问一个问题,比如“我如何给一个字符串加1?”“我们知道我们犯了一个设计错误。就像在问“哪条领带更配这件波罗衫?“这是不对的。
'M000000000009'
是所谓的“智能密钥”。即,实际上包括两个或更多个部分的一个柱。这打破了第一范式,因为它不是原子的(尽管原子性很难定义)。但这不是抽象的设计要点:智能钥匙是愚蠢的。他们很难相处,正如你所发现的。在编写查询或填充记录时,我们不可避免地会使用SUBSTR和INSTR。
更好的实现方式是将智能密钥的原子组件存储为单独的列,并在向用户显示它们时将它们连接起来。这仍然是一个有点痛苦,但甲骨文删除了pfaffing约在11 g与引进高度整洁的虚拟列。这些列是基于规则的列,由其他列自动填充。我们可以在虚拟列上构建索引甚至约束。
所以在你的例子中,你有一个键,它包括一个字母前缀和一个单调递增的数字。你可以这样实现它:
LiveSQL demo script.
数字分量
cat_number
是一个数字,因此您可以将其填充为任何其他数字-通过算术,使用序列或-自12 c起-作为IDENTITY列:jqjz2hbq3#
蛮力和不漂亮
如果字符串的倒数第二个部分没有转换为整数,则会失败