Sql 针对正则表达式的Oracle db查询未给出正确的结果

Sql 针对正则表达式的Oracle db查询未给出正确的结果,sql,database,oracle10g,Sql,Database,Oracle10g,我正在使用Oracle数据库和表 ----------------------------- ID : NAME ------------------------------ 现在我需要知道有多少名字跟在福林条件后面 可以包含A到Z 可以包含a到z 能容纳_ 我有书面询问 SELECT * FROM REGEX_TEST WHERE REGEXP_LIKE (name,'[A-Za-z0-9_]') 但这并没有给我正确的结果 我想要的样品结果 ID Text Ex

我正在使用Oracle数据库和表

-----------------------------
ID   :  NAME
------------------------------
现在我需要知道有多少名字跟在福林条件后面

  • 可以包含A到Z
  • 可以包含a到z
  • 能容纳_
  • 我有书面询问

    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
    
    //------------结果-----------


    此时,您的模式匹配名称中的任何字符;它将只排除不包含任何这些范围的值,而不是您似乎想要排除包含任何其他内容的值。因此,您需要使用^和$锚定模式,并添加一个量词以允许模式重复,使用*或?。因此,模式变为“
    ”^[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时说你也需要数字

    您还可以使用字母数字类而不是Range,它可以更安全地处理其他语言(当然,这取决于您希望匹配的语言):

    或\w运算符:

    WHERE REGEXP_LIKE (name, '^\w*$');
    
    或者不需要锚定的not word运算符:

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

    Sow样本数据、您得到的结果和预期结果。还有ddl。聚合函数COUNT用于计算行数。您的意思是可以包含A-Z、A-Z、0-9,但不能包含其他字符?您希望返回失败行(包含失败文本)还是根本不返回?@jarlh:(1)是的,我只需要A-Z A-Z和Z(2)我不希望结果包含失败文本,但我希望所有将通过的结果
    WHERE REGEXP_LIKE (name, '^\w*$');
    
    WHERE NOT REGEXP_LIKE (name, '\W');