问题描述
背景:我有 3 列:项目、描述、描述 2。一个项目可以用另一个项目编号替换,并在 description 或 description2 列中指明。描述和描述 2 包含对项目的描述,并且只要该项目有替换项目,描述或描述 2 就可以包含一些常用短语以指示使用新的项目编号。示例:REPLACE W 12345 OLD 54321。所以我有一个第 4 列,我想将 12345 数字提取到其中。
使用的代码如下。基本上我发现如果有一个新的项目编号要使用,它总是会像这样设置:常用短语后跟一个空格,然后是项目编号。另一个例子是:见 12345。
我不得不使用带有空格的 concat,因为描述字段限制为 30 个字符,有时描述会使用整个 30 个字符,最后是项目替换编号。我的代码看起来停在数字后面的空白处。每当我添加 concat 片段时,都会出现以下错误:
ORA-12725:正则表达式中的括号不匹配 12725. 00000 - “正则表达式中不匹配的括号” *原因:正则表达式没有平衡括号。 *行动:确保括号正确平衡。
我已经检查了几次,但找不到任何不匹配的括号。知道为什么我会收到此错误吗?我一次注释掉一行,它在 REPLACE W 上出错。虽然,当我跑的时候:
REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(REPLACE W )(\d+)(\s)'),'(\d+)') it seems to run fine. I need to have the case when piece with it though.
when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(SEE TEMP )(\d+)(\s)'),'(\d+)') is not null then REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(\d+)')
when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)') is not null then REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)')
when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(ITEM )(\d+)(\s)'),'(NEW )(\d+)(\s)'),'(REPL W )(\d+)(\s)'),'(\d+)')
--when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(\d+)')
--when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(REPLACE W (\d+)(\s)'),'(REPLACE W/)(\d+)(\s)'),'(SEE )(\d+)(\s)'),'(SEE RX )(\d+)(\s)'),'(SEE SUB )(\d+)(\s)'),'(SUB TO )(\d+)(\s)'),'(TEMP HOLD )(\d+)(\s)'),'(\d+)')*/
我无权访问 oracle sql,所以我无法从文本编辑器中获取它。欣赏这些想法。
解决方法
你的 SQL 看起来不错
SQL> create table t ( description varchar2(10),description2 varchar2(10));
Table created.
SQL>
SQL> select
2 case
3 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(SEE TEMP )(\d+)(\s)'),'(\d+)') is not null then REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(\d+)')
4 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)') is not null then REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)')
5 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(ITEM )(\d+)(\s)'),'(\d+)')
6 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)')
7 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(NEW )(\d+)(\s)'),'(\d+)')
8 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)')
9 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(REPL W )(\d+)(\s)'),'(\d+)')
10 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)')
11 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(REPLACE W )(\d+)(\s)'),'(\d+)')
12 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(REPLACE W (\d+)(\s)'),'(\d+)')
13 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(REPLACE W/)(\d+)(\s)'),'(\d+)')
14 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)')
15 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(SEE )(\d+)(\s)'),'(\d+)')
16 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)')
17 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(SEE RX )(\d+)(\s)'),'(\d+)')
18 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)')
19 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(SEE SUB )(\d+)(\s)'),'(\d+)')
20 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)')
21 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(SUB TO )(\d+)(\s)'),'(\d+)')
22 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)')
23 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description||' ','(TEMP HOLD )(\d+)(\s)'),'(\d+)')
24 when REGEXP_SUBSTR(REGEXP_SUBSTR(i.description2||' ','(\d+)')
25 end
26 from t i;
no rows selected