不了解 Oracle 中的 regexp_like
not understanding regexp_like in Oracle
我在查询中的 With 子句中定义了以下示例:
'.+d$'
作为 sec_level_pattern
来自 dual
现在我可以在 select 查询中看到以下情况:
not regexp_like(name,sec_level_pattern)
name
是我的 rd_tst
table.
的专栏
条件 regexp_like
在这里检查什么?我几乎没有看到关于 regexp_like
的问题,但不明白我的用例中实际会检查什么。
这个模式:
'.+d$'
确实是字符串。它正在寻找至少一个字符(通常为 non-newline),后跟小写字母 'd'
,然后是文字 '$'
。所以,这匹配:
Xd$
123d$abc
相当于:like '%_d$%'
.
很有可能,您想要更合理的 '\d+$'
。这将匹配任何以数字结尾的字符串。
what did i need to change for sec_level_pattern
to return all the name ?
您的示例数据似乎具有以下格式:
- 字符串的开始;
- 两个 upper-case 字母字符;
- 十个upper-casealpha-numeric个字符;
- 字符
.GTX
;然后
- 字符串结束。
您需要一个匹配相同内容的正则表达式,例如:
SELECT *
FROM table_name
WHERE REGEXP_LIKE( names, '^[A-Z]{2}[A-Z0-9]{10}\.GTX$' );
您的示例数据:
CREATE TABLE table_name ( Names ) AS
SELECT 'AT0000730007.GTX' FROM DUAL UNION ALL
SELECT 'CH0012032048.GTX' FROM DUAL UNION ALL
SELECT 'DE0005550602.GTX' FROM DUAL UNION ALL
SELECT 'DE0007236101.GTX' FROM DUAL UNION ALL
SELECT 'DE000A1EWWW0.GTX' FROM DUAL UNION ALL
SELECT 'DE000ENAG999.GTX' FROM DUAL UNION ALL
SELECT 'DE000TUAG000.GTX' FROM DUAL UNION ALL
SELECT 'FI0009000681.GTX' FROM DUAL UNION ALL
SELECT 'FR0000120172.GTX' FROM DUAL UNION ALL
SELECT 'FR0000125007.GTX' FROM DUAL UNION ALL
SELECT 'IT0003132476.GTX' FROM DUAL UNION ALL
SELECT 'NL0000235190.GTX' FROM DUAL UNION ALL
SELECT 'NL0011794037.GTX' FROM DUAL UNION ALL
SELECT 'SE0000148884.GTX' FROM DUAL;
Returns所有名字:
| NAMES |
| :--------------- |
| AT0000730007.GTX |
| CH0012032048.GTX |
| DE0005550602.GTX |
| DE0007236101.GTX |
| DE000A1EWWW0.GTX |
| DE000ENAG999.GTX |
| DE000TUAG000.GTX |
| FI0009000681.GTX |
| FR0000120172.GTX |
| FR0000125007.GTX |
| IT0003132476.GTX |
| NL0000235190.GTX |
| NL0011794037.GTX |
| SE0000148884.GTX |
db<>fiddle here
我在查询中的 With 子句中定义了以下示例:
'.+d$'
作为 sec_level_pattern
来自 dual
现在我可以在 select 查询中看到以下情况:
not regexp_like(name,sec_level_pattern)
name
是我的 rd_tst
table.
条件 regexp_like
在这里检查什么?我几乎没有看到关于 regexp_like
的问题,但不明白我的用例中实际会检查什么。
这个模式:
'.+d$'
确实是字符串。它正在寻找至少一个字符(通常为 non-newline),后跟小写字母 'd'
,然后是文字 '$'
。所以,这匹配:
Xd$
123d$abc
相当于:like '%_d$%'
.
很有可能,您想要更合理的 '\d+$'
。这将匹配任何以数字结尾的字符串。
what did i need to change for
sec_level_pattern
to return all the name ?
您的示例数据似乎具有以下格式:
- 字符串的开始;
- 两个 upper-case 字母字符;
- 十个upper-casealpha-numeric个字符;
- 字符
.GTX
;然后 - 字符串结束。
您需要一个匹配相同内容的正则表达式,例如:
SELECT *
FROM table_name
WHERE REGEXP_LIKE( names, '^[A-Z]{2}[A-Z0-9]{10}\.GTX$' );
您的示例数据:
CREATE TABLE table_name ( Names ) AS
SELECT 'AT0000730007.GTX' FROM DUAL UNION ALL
SELECT 'CH0012032048.GTX' FROM DUAL UNION ALL
SELECT 'DE0005550602.GTX' FROM DUAL UNION ALL
SELECT 'DE0007236101.GTX' FROM DUAL UNION ALL
SELECT 'DE000A1EWWW0.GTX' FROM DUAL UNION ALL
SELECT 'DE000ENAG999.GTX' FROM DUAL UNION ALL
SELECT 'DE000TUAG000.GTX' FROM DUAL UNION ALL
SELECT 'FI0009000681.GTX' FROM DUAL UNION ALL
SELECT 'FR0000120172.GTX' FROM DUAL UNION ALL
SELECT 'FR0000125007.GTX' FROM DUAL UNION ALL
SELECT 'IT0003132476.GTX' FROM DUAL UNION ALL
SELECT 'NL0000235190.GTX' FROM DUAL UNION ALL
SELECT 'NL0011794037.GTX' FROM DUAL UNION ALL
SELECT 'SE0000148884.GTX' FROM DUAL;
Returns所有名字:
| NAMES | | :--------------- | | AT0000730007.GTX | | CH0012032048.GTX | | DE0005550602.GTX | | DE0007236101.GTX | | DE000A1EWWW0.GTX | | DE000ENAG999.GTX | | DE000TUAG000.GTX | | FI0009000681.GTX | | FR0000120172.GTX | | FR0000125007.GTX | | IT0003132476.GTX | | NL0000235190.GTX | | NL0011794037.GTX | | SE0000148884.GTX |
db<>fiddle here