Oracle SQL-如何使用SUBSTR从字符串中剪切字符?

Oracle SQL-如何使用SUBSTR从字符串中剪切字符?,sql,oracle,substr,Sql,Oracle,Substr,在我需要的特定列中,我有ABC1234、ABC、DEF456、GHI等值 现在我需要拆分此字符串,但仅当字符(例如ABC)后面跟有数字时 因此,如果值是ABC1234,那么我需要将ABC和1234分开。但是如果只有ABC作为一个值,我只需要ABC。我找不到SUBSTR的任何解决方案。你知道吗 注意:字符的长度可以从1到10不等,而且数字的长度有时与我向您展示的不同。这样做可以吗 SQL> with test (col) as 2 (select '"ABC1234", "ABC"

在我需要的特定列中,我有ABC1234、ABC、DEF456、GHI等值

现在我需要拆分此字符串,但仅当字符(例如ABC)后面跟有数字时

因此,如果值是ABC1234,那么我需要将ABC和1234分开。但是如果只有ABC作为一个值,我只需要ABC。我找不到SUBSTR的任何解决方案。你知道吗


注意:字符的长度可以从1到10不等,而且数字的长度有时与我向您展示的不同。

这样做可以吗

SQL> with test (col) as
  2    (select '"ABC1234", "ABC", "dEf456", "123GHI", "456"' from dual),
  3  inter as
  4    (select trim(regexp_substr(replace(col, '"', ''), '[^,]+', 1, level)) token
  5     from test
  6     connect by level <= regexp_count(col, ',') + 1
  7    )
  8  select regexp_substr(token, '^[a-zA-Z]+') letters,
  9         regexp_substr(token, '[0-9]+$') digits
 10  from inter
 11  where regexp_like(token, '^[a-zA-Z]+[0-9]+$');

LETTERS    DIGITS
---------- ----------
ABC        1234
dEf        456

SQL>

像这样的东西行吗

SQL> with test (col) as
  2    (select '"ABC1234", "ABC", "dEf456", "123GHI", "456"' from dual),
  3  inter as
  4    (select trim(regexp_substr(replace(col, '"', ''), '[^,]+', 1, level)) token
  5     from test
  6     connect by level <= regexp_count(col, ',') + 1
  7    )
  8  select regexp_substr(token, '^[a-zA-Z]+') letters,
  9         regexp_substr(token, '[0-9]+$') digits
 10  from inter
 11  where regexp_like(token, '^[a-zA-Z]+[0-9]+$');

LETTERS    DIGITS
---------- ----------
ABC        1234
dEf        456

SQL>
使用SUBSTR和INSTR并翻译:

Oracle 11g R2架构设置:

问题1:

:

使用SUBSTR和INSTR并翻译:

Oracle 11g R2架构设置:

问题1:

:

如果值是ABC1234,那么我需要去掉ABC和1234 分开。但是如果只有ABC作为一个值,我只需要 美国广播公司

在其他解决方案中,我提出一种解决方案,如下所示:

逻辑:

1将所有数字替换为1。检查字符串中出现的数字的位置。如果 字符串中没有数字,请使用该字符串

2将字母从第一个位置提取到 数字开始

3从起始位置到结束位置提取数字。如果数字不存在,则将其设置为空

结果:

SQL> /
Original_Column Col_Alp col_digit
----------      -----   -----
ABC1234      ABC       1234
ABC          ABC       NULL
dEfH456      dEfH      456
123GHI       NULL       123GHI
456          NULL       456
如果值是ABC1234,那么我需要去掉ABC和1234 分开。但是如果只有ABC作为一个值,我只需要 美国广播公司

在其他解决方案中,我提出一种解决方案,如下所示:

逻辑:

1将所有数字替换为1。检查字符串中出现的数字的位置。如果 字符串中没有数字,请使用该字符串

2将字母从第一个位置提取到 数字开始

3从起始位置到结束位置提取数字。如果数字不存在,则将其设置为空

结果:

SQL> /
Original_Column Col_Alp col_digit
----------      -----   -----
ABC1234      ABC       1234
ABC          ABC       NULL
dEfH456      dEfH      456
123GHI       NULL       123GHI
456          NULL       456

请尝试下面的查询,以了解所提到的场景,我没有拆分后跟数字的if字符:

with test (col) as
  (select 'ABC1234' from dual union all
   select 'ABC'     from dual union all
   select 'dEfH456'  from dual union all
   select '123GHI'  from dual union all
   select '456'     from dual
  )

  select col,reverse(trim(regexp_replace(reverse(col),'^[0-9]+',' '))) string ,trim(regexp_replace(col,'^[a-zA-Z]+',' ')) numbers from test
如果要将该字符和字符串移动到我的case语句的任何位置

with test (col) as
  (select 'ABC1234' from dual union all
   select 'ABC'     from dual union all
   select 'dEfH456'  from dual union all
   select '123GHI'  from dual union all
   select '456'     from dual
  )

  select v.col,case when v.string=v.numbers THEN NULL ELSE string end string , v.numbers
  from (select col,reverse(trim(regexp_replace(reverse(col),'^[0-9]+',' '))) string ,trim(regexp_replace(col,'^[a-zA-Z]+',' ')) numbers from test) v

请尝试下面的查询,以了解所提到的场景,我没有拆分后跟数字的if字符:

with test (col) as
  (select 'ABC1234' from dual union all
   select 'ABC'     from dual union all
   select 'dEfH456'  from dual union all
   select '123GHI'  from dual union all
   select '456'     from dual
  )

  select col,reverse(trim(regexp_replace(reverse(col),'^[0-9]+',' '))) string ,trim(regexp_replace(col,'^[a-zA-Z]+',' ')) numbers from test
如果要将该字符和字符串移动到我的case语句的任何位置

with test (col) as
  (select 'ABC1234' from dual union all
   select 'ABC'     from dual union all
   select 'dEfH456'  from dual union all
   select '123GHI'  from dual union all
   select '456'     from dual
  )

  select v.col,case when v.string=v.numbers THEN NULL ELSE string end string , v.numbers
  from (select col,reverse(trim(regexp_replace(reverse(col),'^[0-9]+',' '))) string ,trim(regexp_replace(col,'^[a-zA-Z]+',' ')) numbers from test) v

如果你有AB12CD34呢?这是不可能的。请编辑原始帖子以显示处理前后的实际数据示例。您是否有能力修复数据库设计,或者您是否被这种违反第一标准格式的行为所困扰?如果您有AB12CD34呢?这是不可能的。请编辑原始帖子,以显示处理前后的实际数据示例。您是否有能力修复数据库设计,或者您是否被这种违反第一标准形式的行为所困扰?这不起作用。我怎么说ABC123不是一列,它是一个超过1000个不同值的值。也可以是ABCDEFG1234567,这样您的SUBSTR与1、3之间就不会发生冲突work@fnr针对不同的长度值进行更新。只需使用任意一个,使值位于一列中。然后更新数据结构,使它们合理地存储在列中,而不是试图使用分隔字符串。这不起作用。我怎么说ABC123不是一列,它是一个超过1000个不同值的值。也可以是ABCDEFG1234567,这样您的SUBSTR与1、3之间就不会发生冲突work@fnr针对不同的长度值进行更新。只需使用任意一个,使值位于一列中。然后更新数据结构,使它们合理地存储在列中,而不是试图使用分隔字符串。它们每天也会增加几十个。我不能为他们每个人写一个选择。啊!我没有意识到所有这些列都在同一列中。我编辑了我的答案;请看一看,@fnr。我在该列中有1000多个值。它们每天也会增加几十个。我不能为他们每个人写一个选择。啊!我没有意识到所有这些列都在同一列中。我编辑了我的答案;请看一看,@fnr。