0

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

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

我需要找到所有非数字的结尾。在此示例中,这意味着 PE、AIO、F、ON、B 和 F。

在伪代码中,我想象我需要类似的东西

SELECT DISTINCT X FROM 
  (SELECT SUBSTR(COL,[SOME_CLEVER_LOGIC]) AS X FROM TABLE);

有任何想法吗?我可以在不学习正则表达式的情况下解决这个问题吗?

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

4

3 回答 3

3

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

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

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

于 2012-10-26T09:35:12.587 回答
2

为了可读性,我建议使用REGEXP_SUBSTR函数(当然,如果没有性能问题,因为这肯定比公认的解决方案慢)。

...也类似于 REGEXP_INSTR,但不是返回子字符串的位置,而是返回子字符串本身

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

(:alpha: 也受支持,正如@Audun 所写)

也很有用:Oracle Regexp Support(开始页面)

于 2012-10-26T09:35:31.967 回答
1

例如

SELECT SUBSTR(col,INSTR(TRANSLATE(col,'A0123456789','A..........'),'.',-1)+1)
  FROM table;
于 2012-10-26T09:30:50.120 回答