2

我正在尝试从文本字符串中提取数字并将其连接到另一个表。这是我到目前为止所拥有的:

SELECT sect.id, 
       sect.section_number, 
       sect.expression, 
       p.abbreviation
  FROM sections sect
  JOIN period p ON SUBSTR(sect.expression, 1, (INSTR(sect.expression,'(')-1)) = p.period_number 
               AND p.schoolid = 73253 
               AND p.year_id = 20
  JOIN courses c ON sect.course_number = c.course_number
 WHERE sect.schoolid = 73253 
   AND sect.termid >= 2000

我阅读了一些其他线程并想出了如何去掉数字(它总是出现在左括号之前)。问题在于,这仅占 sect.expression 列中三种类型数据中的两种——

9(A) - check  
10(A) - check

但不是

5-6(A)

5-6(A) 将退回 Oracle 01722 无效号码错误。有没有办法我可以修改 substr... 行,以便对于 5-6(A) 数据类型,它会抓取第一个数字(5)并加入其中?

值得一提的是,我只有对该表的读取权限,因此任何依赖于创建某种帮助表/列的解决方案都不起作用。

谢谢!

4

2 回答 2

2

作为Oracle 10g,您可以改用正则表达式

JOIN period p ON REGEXP_SUBSTR(sect.expression, '^\d+', 1, 1) = p.period_number 

诚然,我提供的正则表达式需要工作——它将在字符串的开头获得第一个数字。如果您需要更复杂的正则表达式,我推荐这个网站:http ://www.regular-expressions.info/tutorial.html

于 2011-01-04T20:41:09.193 回答
2

您可以使用 REGEXP_REPLACE

1)如果您只想提取数字:

JOIN period p ON REGEXP_REPLACE(sect.expression, '[^0-9]', '') = p.period_number 

2)如果要匹配字符串开头的数字并忽略后面出现的数字:

JOIN period p ON REGEXP_REPLACE(sect.expression, '^(\d+)(.*)', '\1') 
于 2011-01-04T20:47:36.803 回答