我有一个包含以下数据的表:
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
你能告诉我一个怎么做的想法吗?
答案 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_LIKE
与DIGIT
字符类和简单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:非常感谢!!!!!