在oracle中使用regexp_substring从字符串中提取数字

yhqotfr8  于 2023-06-29  发布在  Oracle
关注(0)|答案(2)|浏览(198)

我有一个oracle数据字段,我需要从中提取节名(2-4个字符)和节号(总是4个数字)。
我的数据看起来像这样:

MATH 1175 Calculus II
MATH 1153 Statistical Reasoning
ENGL 1101 Writing and Rhetoric I
FIN 1115 Personal Finance
SPAN 1102 Elementary Spanish II
POLS 1102 Intro to Politics Critical Thinking & Analysis
MA 0104 Intro to Medical Assisting Administrative
HO 0107 Medical Law and Ethics

在Oracle中,我已经成功地使用以下语句提取了部分:

REGEXP_SUBSTR(instance_name,'^[A-Z]{2,4}') ISU_SUBJECT

注意:instance_name是包含字段数据的列的名称(如上所述)。
要提取接下来的四个数字,只需提取\d{4}即可。但是,RegEx不支持可变长度的向后查找。所以我会尝试下面的代码来获得三种不同长度的可能性。它可以使用正则表达式测试,但我无法让它在Oracle SQL Developer中工作。我想下面的代码可以提取4个字符的部分编号。但这不起作用:

,REGEXP_SUBSTR(instance_name,'(?<=^[A-Z]{4} )\d{4}') ISU_Course_Number

当然,这也是行不通的

,REGEXP_SUBSTR(instance_name,'((?<=^[A-Z]{4} )|(?<=^[A-Z]{3} )|(?<=^[A-Z]{2} ))\d{4}') ISU_Course_Number

有什么办法让这个号码提取工作吗?

ars1skjm

ars1skjm1#

这两行成功地将主题和课程编号提取到单独的字段中:

,REGEXP_SUBSTR(instance_name,'^[A-Z]{2,4}') ISU_SUBJECT
,REGEXP_SUBSTR(instance_name, REGEXP_SUBSTR(instance_name,'^[A-Z]{2,4} (\d{4})', 1, 1, NULL, 1)) ISU_Course_Number
jei2mxaa

jei2mxaa2#

如果所有行看起来都像您作为示例数据发布的行,则:如果你可以使用简单快速的substr + instr组合,为什么要把事情变得复杂和潜在的缓慢呢?
将所有内容提取到第二个空格:

SQL> select instance_name,
  2    substr(instance_name, 1, instr(instance_name, ' ', 1, 2) - 1) result
  3  from test;

INSTANCE_NAME                                            RESULT
-------------------------------------------------------- ----------
MATH 1175 Calculus II                                    MATH 1175
MATH 1153 Statistical Reasoning                          MATH 1153
ENGL 1101 Writing and Rhetoric I                         ENGL 1101
FIN 1115 Personal Finance                                FIN 1115
SPAN 1102 Elementary Spanish II                          SPAN 1102
POLS 1102 Intro to Politics Critical Thinking & Analysis POLS 1102
MA 0104 Intro to Medical Assisting Administrative        MA 0104
HO 0107 Medical Law and Ethics                           HO 0107

8 rows selected.

SQL>

如果你需要将值分成两列(我不明白你想要两列),也没有问题。
仍然是substr + instr(尽管现在有点复杂):

SQL> select instance_name,
  2    substr(instance_name, 1, instr(instance_name, ' ', 1, 1) - 1) subject,
  3    substr(instance_name,
  4           instr(instance_name, ' ', 1, 1) + 1,
  5           instr(instance_name, ' ', 1, 2) - instr(instance_name, ' ', 1, 1) - 1) code
  6  from test;

INSTANCE_NAME                                            SUBJECT    CODE
-------------------------------------------------------- ---------- ----------
MATH 1175 Calculus II                                    MATH       1175
MATH 1153 Statistical Reasoning                          MATH       1153
ENGL 1101 Writing and Rhetoric I                         ENGL       1101
FIN 1115 Personal Finance                                FIN        1115
SPAN 1102 Elementary Spanish II                          SPAN       1102
POLS 1102 Intro to Politics Critical Thinking & Analysis POLS       1102
MA 0104 Intro to Medical Assisting Administrative        MA         0104
HO 0107 Medical Law and Ethics                           HO         0107

8 rows selected.

或者,简单的正则表达式:从instance_name中获取第一个和第二个 * 字 *。它们是什么数据类型并不重要,这是源字符串的前两部分:

SQL> select instance_name,
  2    regexp_substr(instance_name, '\w+', 1, 1) subject,
  3    regexp_substr(instance_name, '\w+', 1, 2) code
  4  from test;

INSTANCE_NAME                                            SUBJECT    CODE
-------------------------------------------------------- ---------- ----------
MATH 1175 Calculus II                                    MATH       1175
MATH 1153 Statistical Reasoning                          MATH       1153
ENGL 1101 Writing and Rhetoric I                         ENGL       1101
FIN 1115 Personal Finance                                FIN        1115
SPAN 1102 Elementary Spanish II                          SPAN       1102
POLS 1102 Intro to Politics Critical Thinking & Analysis POLS       1102
MA 0104 Intro to Medical Assisting Administrative        MA         0104
HO 0107 Medical Law and Ethics                           HO         0107

8 rows selected.

SQL>

相关问题