最后在数字处找到值和相应的条目

时间:2014-10-01 08:11:38

标签: sql oracle

我有一个包含以下数据的表:

col1 col2 col3 col4
1      A    B   Z-A.P-E-001.02
2      A    B   Z.01
3      A    B   Z.02
4      A    B   Z-A.P-E-001.01
5      C    D   M.01
6      C    D   M.02

我想在col4中找到最后有数字的值(最后一个'。'后面的数字)。例如在这种情况下,预期的结果是:

value col4
Z            Z.01
Z            Z.02
Z            Z.03
M            M.01
M            M.02
Z-A.P-E-001  Z-A.P-E-001.01
Z-A.P-E-001  Z-A.P-E-001.02

你能告诉我一个怎么做的想法吗?

3 个答案:

答案 0 :(得分:3)

使用Orace的正则表达式函数,regexp_substr()regexp_like()

我不确定你的实际要求是什么,但是这样的事情(在我的脑海中):

-- will match up to dot, but not including
select regexp_substr(col4, '^\w+') as value, col4
 from tab
  where regexp_like(col4, '\d');               -- if any digit in column

或者,如果您只想在字段末尾查找带数字的值,请使用$ anchor

  where regexp_like(col4, '\d$'); 

答案 1 :(得分:0)

REGEXP_LIKEDIGIT字符类和简单SUBSTR一起使用,仅检查字符串的结尾字符是否为NUMBER

SQL> WITH DATA AS(
  2  SELECT 1 COL1, 'A' COL2, 'B' COL3, 'Z.01' COL4 FROM DUAL UNION ALL
  3  SELECT 2,      'P',    'B',   'Z.02' FROM DUAL UNION ALL
  4  SELECT 3,      'Q',    'B',   'Z.03' FROM DUAL UNION ALL
  5  SELECT 4,      'C',    'D',   'M.01' FROM DUAL UNION ALL
  6  SELECT 5,      'X',    'D',   'M.01' FROM DUAL UNION ALL
  7  SELECT 6,      'C',    'D',   'M.A1' FROM DUAL UNION ALL
  8  SELECT 7,      'C',    'D',   'M.1A' FROM DUAL)
  9  SELECT * FROM DATA
 10  WHERE regexp_like(substr(col4,-1), '[[:digit:]]')
 11  /

      COL1 C C COL4
---------- - - ----
         1 A B Z.01
         2 P B Z.02
         3 Q B Z.03
         4 C D M.01
         5 X D M.01
         6 C D M.A1

6 rows selected.

答案 2 :(得分:0)

这就是我在梅尔文史密斯的帮助下得出的答案:

SELECT SUBSTR(col4, 0, instr(col4, regexp_substr(col4, '\.\d+$')) -1) AS VALUE, col4
 FROM new_test
  where regexp_like(col4, '\.\d+$');

@Melvin:非常感谢!!!!!