我正在尝试从文本字符串中提取数字并将其连接到另一个表。这是我到目前为止所做的:
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)并加入其中?
值得一提的是,我只对此表具有读取权限,因此任何依赖于创建某种辅助表/列的解决方案都不起作用。
谢谢!
答案 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')