我只需要从 varchar 字段中提取以 4 个数字结尾的值。例如,我需要 SMITH0821,但不需要 SMITH1。
4 回答
您可以使用 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 中使用正则表达式,所以我希望它们能正常工作,否则你可以使用我提供的链接对它们进行微调。
使用 regexp_like:
select * from tablename t
where regexp_like(t.columname, '[:alpha:][:digit:]{4}$')
这将确保您的用户名末尾有一个字母字符,后跟 4 位数字。
这是一个体面的文档的链接:http: //psoug.org/reference/regexp.html
您可以使用 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'
用于不区分大小写的匹配。
这将起作用:
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');