如何在混合字母数字字段的最后一个非数字部分选择DISTINCT?

时间:2012-10-26 08:46:47

标签: sql string oracle

我的数据集看起来像这样:

A6177PE
A85506
A51SAIO
A7918F
A810004
A11483ON
A5579B
A89903
A104F
A9982
A8574
A8700F

我需要找到所有非数字的ENDings。在这个例子中,这意味着PE,AIO,F,ON,B和F.

在伪代码中,我想象我需要像

这样的东西
SELECT DISTINCT X FROM 
  (SELECT SUBSTR(COL,[SOME_CLEVER_LOGIC]) AS X FROM TABLE);

有什么想法吗?我可以在不学习regexp的情况下解决这个问题吗?

编辑:为了澄清,我的数据集比这个例子大很多。另外,我只对数字部分之后的字符串部分感兴趣。如果字符串是“A6177PE”,我想要“PE”。

3 个答案:

答案 0 :(得分:3)

免责声明:我不了解Oracle SQL。但是,我认为这样的事情应该有效:

SELECT DISTINCT X FROM 
  (SELECT SUBSTR(COL,REGEXP_INSTR(COL, "[[:ALPHA:]]+$")) AS X FROM TABLE);

REGEXP_INSTR(COL,“[[:ALPHA:]] + $”)应该返回字段末尾第一个字符的位置。

答案 1 :(得分:2)

为了便于阅读,我建议使用REGEXP_SUBSTR功能(如果当然没有性能问题,因为这肯定比接受的解决方案慢)。

  

...也类似于REGEXP_INSTR,但它没有返回子串的位置,而是返回子串本身

SELECT DISTINCT SUBSTR(MY_COLUMN,REGEXP_SUBSTR("[a-zA-Z]+$")) FROM MY_TABLE;

(:alpha:也支持,正如@Audun写的那样)

也很有用:Oracle Regexp Support (beginning page)

答案 2 :(得分:1)

例如

SELECT SUBSTR(col,INSTR(TRANSLATE(col,'A0123456789','A..........'),'.',-1)+1)
  FROM table;