正则表达式的Oracle数据库查询未提供正确的结果

时间:2015-03-18 08:50:08

标签: sql database oracle10g

我正在使用Oracle数据库和表

-----------------------------
ID   :  NAME
------------------------------

现在我需要知道有多少名字跟随嬉戏条件

  1. 可以包含A到Z
  2. 可以包含a到z
  3. 可以包含_
  4. 我写了查询

    SELECT *
    FROM REGEX_TEST
    WHERE  REGEXP_LIKE (name,'[A-Za-z0-9_]')
    

    但这并没有给我正确的结果

    我想要的样本结果

    ID  Text          Expected result
    1   PLAN_20001    PASS
    2   A937AH        PASS
    3   556679815     PASS
    4   A93_7AH       PASS
    5   PLANavd20001  PASS
    6   A93*7AH       FAIL
    7   A93%7AH       FAIL
    8   A93^7AH       FAIL
    9   A93$7AH    FAIL
    10  A93@7AH       FAIL
    11  A93!7AH       FAIL
    12  A93~7AH    FAIL
    13  A93+7AH       FAIL
    

    // ------------结果-----------

    1   PLAN20001
    2   A937AH
    3   556679815
    4   A93 7AH
    5   PLANavd20001
    6   A93*7AH
    7   A93%7AH
    8   A93^7AH
    9   A93$7AH
    10  A93@7AH
    11  A93!7AH
    12  A93~7AH
    13  A93+7AH
    

1 个答案:

答案 0 :(得分:1)

目前您的模式与名称中的任何字符匹配;它只会排除根本不包含任何这些范围的值,而不是排除包含任何其他值的值。因此,您需要使用^和$锚定模式,并添加一个量词以允许重复模式,使用*或?。因此模式变为'^[A-Za-z0-9_]*$'

使用CTE进行演示以表示您的样本数据:

WITH REGEX_TEST (id, name) AS (
  select 1, 'PLAN20001' from dual
  union all select 2,'A937AH' from dual
  union all select 3, '556679815' from dual
  union all select 4, 'A93 7AH' from dual
  union all select 5, 'PLANavd20001' from dual
  union all select 6, 'A93*7AH' from dual
  union all select 7, 'A93%7AH' from dual
  union all select 8, 'A93^7AH' from dual
  union all select 9, 'A93$7AH' from dual
  union all select 10, 'A93@7AH' from dual
  union all select 11, 'A93!7AH' from dual
  union all select 12, 'A93~7AH' from dual
  union all select 13, 'A93+7AH' from dual
)
SELECT *
FROM REGEX_TEST
WHERE REGEXP_LIKE (name, '^[A-Za-z0-9_]*$');

        ID NAME       
---------- ------------
         1 PLAN20001   
         2 A937AH      
         3 556679815   
         5 PLANavd20001

我已经离开数字范围0-9,尽管你说了两次你只想要字母和下划线,因为你回复David Aldridge然后说你确实也想要数字。

您还可以使用字母数字类而不是范围,这样可以更安全地处理其他语言(当然,取决于您想要匹配的内容):

WHERE REGEXP_LIKE (name, '^[[:alnum:]_]*$');

Perl-influenced \ w运营商:

WHERE REGEXP_LIKE (name, '^\w*$');

或者非字操作符,它不需要锚定:

WHERE NOT REGEXP_LIKE (name, '\W');