解码要在连接中使用的文本字符串

时间:2011-01-04 20:31:35

标签: sql oracle oracle10g ora-01722

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

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)并加入其中?

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

谢谢!

2 个答案:

答案 0 :(得分:2)

改为Oracle 10g, you could use a regex

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

不可否认,我提供的正则表达式需要工作 - 它将在字符串的开头获得第一个数字。如果您需要更复杂的正则表达式,我建议您使用此网站:http://www.regular-expressions.info/tutorial.html

答案 1 :(得分: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')