Oracle:在这种情况下如何使用regexp_substr

时间:2012-06-20 14:22:43

标签: sql regex oracle

我在Oracle中有一个表,其中一列包含以\形式的UserIds。例如“fin \ george”,“sales \ andy”等。如何使用REGEXP_SUBSTR函数仅从UserIds获取。即我只想获取“george”,“andy”等。我已经使用SUBSTR函数实现了所需的reult,但我想在这种情况下使用REGEXP_SUBSTR。

我试过这样做:

SELECT REGEXP_SUBSTR('fin\george','\[^\]+,') "UserName" FROM DUAL;

但它没有帮助。任何人都可以指出我的错误吗?

4 个答案:

答案 0 :(得分:3)

我相信您想要使用带有反向引用的regexp_replace。我假设\之前和之后的所有字符都是字母的。如果您允许使用数字,则需要使用[[:alnum:]]而不是[[:alpha::]

  1* SELECT REGEXP_replace('fin\george',
                           '([[:alpha:]]+\\)([[:alpha:]]+)$', 
                           '\2') "UserName" 
       FROM DUAL
SQL> /

UserNa
------
george

答案 1 :(得分:0)

您必须使用转义:\\而不是\

答案 2 :(得分:0)

SQL> SELECT REGEXP_SUBSTR('fin\george', '[^\]+', 1, 2) AS userId from dual;

USERID
------
george

请参阅this Oracle Base article

答案 3 :(得分:0)

最简单的方法(恕我直言)如下:

SELECT REGEXP_SUBSTR('fin\george', '[^\\]+$') AS "UserName" FROM DUAL;

原始查询的问题是(a)\字符未被转义,(b)正则表达式中存在无关的逗号。我在这里使用了字符串结尾锚$,假设\分隔的元素不超过两个。如果有两个以上,而您只需要第二个,则可以使用以下内容:

SELECT REGEXP_SUBSTR('fin\george\ringo', '[^\\]+', 1, 2) AS "UserName"
  FROM DUAL;

这告诉Oracle开始查看字符串的第一个字符并返回第二个匹配。