在SQL中读取字母数字字符串的一部分

时间:2009-08-05 04:08:45

标签: sql oracle oracle10g

我有一个表有一列“otname” table1.otname包含多行字母数字字符串,类似于以下数据样本:

32年11月10日。的 12 .U.A.F.3.2.21.249.1

2001.1.1003。的 8281 .A.LE.P.P

2010.1.1003。的 8261 .A.LE.B.B

我想读取每个字符串中的第四个数字(粗体字符串的一部分)并在Oracle 10g中编写查询 阅读存储在另一个表中的描述。我的困境是编写查询的第一部分.i.e。选择表格中每个字符串的第四个数字

我的第二个查询是这样的:

select description_text from table2 where sncode = 8281  -- fourth part of the data sample in every string

非常感谢。

新手

2 个答案:

答案 0 :(得分:0)

适用于9i +:

WITH portion AS (
  SELECT SUBSTR(t.otname, INSTR(t.otname, ".", 1, 3)+1, INSTR(t.otname, ".", 1, 4)) 'sncode'
    FROM TABLE t)
SELECT t.description_text
  FROM TABLE2 t
  JOIN portion p ON p.sncode = t.sncode

使用SUBSTR应该是显而易见的; INSTR用于查找句点(。)的位置,从字符串中的第一个字符(参数值1)开始,在字符串中的第3和第4个外观上。您可能必须从该期间第四个实例返回的位置中减去一个 - 首先进行测试以确保您获得正确的值:

SELECT SUBSTR(t.otname, INSTR(t.otname, ".", 1, 3)+1, INSTR(t.otname, ".", 1, 4)) 'sncode'
 FROM TABLE t

我使用了子查询因子,因此子字符串在您加入第二个表之前发生。它可以作为子查询来完成,但是子查询因子分解更快。

答案 1 :(得分:0)

较新版本的oracle(包括10g)具有各种正则表达式函数。所以你可以这样做:

where sncode = to_number(regexp_replace(otname, '^(\d+\.\d+\.\d+\.(\d+))?.+$', '\2'))

这匹配3组数字 - 后跟a-dot,第4组数字,后跟字符串的其余部分,并返回一个字符串,该字符串由完全由第一组替换的所有字符串组成(第四组数字。)

这是一个完整的查询(如果我理解了你对这两个表的描述):

select t2.description_text
from table1 t1, table2 t2
where t2.sncode = to_number(regexp_replace(t1.otname, '^(\d+\.\d+\.\d+\.(\d+))?.+$', '\2'))

另一个稍短的替代正则表达式:

where t2.sncode = to_number(regexp_replace(t1.otname, '^((\d+\.){3}(\d+))?.+$', '\3'))