Oracles REGEXP_LIKE无法正常工作?

时间:2017-10-05 11:13:30

标签: regex oracle

这可能是我想要的简单但无论如何:

我尝试匹配以'01'结尾的列中的字符串。我目前在我的表达式'[A-Z0-9\-]+01$'中有这个,它匹配我希望与regex101匹配的字符串类型。它应该匹配的字符串应该是这样的:

1-WA01-0009-01

在链接网站中有效。

这是我用来测试它的SQL:

SELECT * 
FROM V_Translog_MDATE_V1 
WHERE  
REGEXP_LIKE (ITEMNO, '[a-zA-Z0-9\-]+01$')
ORDER BY ARINVT_ID

为什么我的正则表达式不在SQL中运行,因为当我知道有与该模式匹配的字符串时,为什么这不会重新生成?

  

已关闭但无法正常工作

我这样做似乎没有什么不合适的,希望它可能与列值本身有关。感谢那些尝试过的人的帮助。

1 个答案:

答案 0 :(得分:1)

  

我尝试匹配以'01'结尾的列中的字符串。

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE V_Translog_MDATE_V1 ( ARINVT_ID, itemno ) AS
SELECT 1, '1-WA01-0009-01' FROM DUAL UNION ALL
SELECT 2, '1-WA01-0009-02' FROM DUAL UNION ALL
SELECT 3, '%&*^$%"£*&%-01' FROM DUAL UNION ALL
SELECT 4, '%&*^$%"£*&%-02' FROM DUAL;

查询1

您可以使用LIKE

SELECT * 
FROM   V_Translog_MDATE_V1 
WHERE  ITEMNO LIKE '%01'
ORDER BY ARINVT_ID

<强> Results

| ARINVT_ID |         ITEMNO |
|-----------|----------------|
|         1 | 1-WA01-0009-01 |
|         3 | %&*^$%"£*&%-01 |

查询2

如果你想使用正则表达式,那么你不需要检查前面的字符:

SELECT * 
FROM   V_Translog_MDATE_V1 
WHERE  REGEXP_LIKE( ITEMNO,  '01$' )
ORDER BY ARINVT_ID

<强> Results

| ARINVT_ID |         ITEMNO |
|-----------|----------------|
|         1 | 1-WA01-0009-01 |
|         3 | %&*^$%"£*&%-01 |

查询3

如果您希望整个字符串与您可接受的前面字符正则表达式匹配,那么您希望在其前面添加^(字符串开头):

SELECT * 
FROM   V_Translog_MDATE_V1 
WHERE  REGEXP_LIKE( ITEMNO,  '^[A-Z0-9\-]+01$' )
ORDER BY ARINVT_ID

<强> Results

| ARINVT_ID |         ITEMNO |
|-----------|----------------|
|         1 | 1-WA01-0009-01 |

(否则[A-Z0-9\-]+01$将与£$£^*&$^"%-01匹配,因为在最终01个字符之前至少有一个匹配的字符。)