1

我只需要从 varchar 字段中提取以 4 个数字结尾的值。例如,我需要 SMITH0821,但不需要 SMITH1。

4

4 回答 4

5

您可以使用 REGEXP_LIKE,如下所示:

select * 
from YourTable t 
where REGEXP_LIKE(t.YourField, '.*[^:digit:][:digit:]{4}', 'n');

我不完全确定正则表达式语法,但您应该能够使用REGEXP_LIKE 上的文档和正则表达式的附录来调整它以适应您的需要。

@Andrew Logvinov 有一个关于匹配太多数字的有效观点。我认为可以通过检查不是数字的字符类来否定这一点。这会将正则表达式更改为:

REGEXP_LIKE(t.YourField, '.*[^:digit:][:digit:]{4}', 'n');

另外,我不确定您是否需要在数字前面添加一个字符,或者只有 4 位数字的 varchars 也应该匹配。以下正则表达式包括字符串锚点的 start ( ^) 和 end ( $) (在上面的表达式中也可能需要)。表达式的其余部分首先包含一个可选组,该组可以由任何字符序列组成,只要它以数字以外的其他内容结尾。在该可选组之后,值结束前需要 4 位数字。

REGEXP_LIKE(t.YourField, '^(.*[^:digit:])?[:digit:]{4}$', 'n');

不幸的是,我目前无法测试它们,而且我不经常在 Oracle 中使用正则表达式,所以我希望它们能正常工作,否则你可以使用我提供的链接对它们进行微调。

于 2012-12-07T19:14:58.443 回答
4

使用 regexp_like:

select * from tablename t
where regexp_like(t.columname, '[:alpha:][:digit:]{4}$')

这将确保您的用户名末尾有一个字母字符,后跟 4 位数字。

这是一个体面的文档的链接:http: //psoug.org/reference/regexp.html

于 2012-12-07T19:24:52.123 回答
1

您可以使用 4 个下划线_ 来匹配 Smith 之后的 4 个字符,如下所示:

  SELECT * from PERSON
   WHERE NAME LIKE 'SMITH____'

或使用REGEXP_LIKE此处的文档)仅匹配 4 位数字:

  SELECT * from PERSON
  WHERE REGEXP_LIKE (NAME , '^SMITH[0-9]{4}$', 'i');

'i'用于不区分大小写的匹配。

于 2012-12-07T19:15:24.343 回答
0

这将起作用:

select field2 from T1
where SUBSTR(field2, -4, 1) IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') AND
      SUBSTR(field2, -3, 1) IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') AND
      SUBSTR(field2, -2, 1) IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') AND
      SUBSTR(field2, -1, 1) IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');       
于 2012-12-07T19:34:36.470 回答