【问题标题】:Why doesn't this regexp_like does not get the results I want为什么这个 regexp_like 没有得到我想要的结果
【发布时间】:2018-06-27 16:34:15
【问题描述】:

我正在尝试使用以下 regexp_like 进行更大的查询,但它不起作用,我做错了什么?

with xx as
  (select '333-22-234223' as a
   from dual)
select xx.a
from xx
where
  regexp_like(xx.a,'^[:digit:]{3}-[:digit:]{2}-[:digit:]{6}$');

【问题讨论】:

    标签: sql oracle regexp-like


    【解决方案1】:

    您可以通过[[:digit:]] (double [...]) 使用以下解决方案:

    WITH xx AS (
        SELECT '333-22-234223' AS a FROM dual
    )
    SELECT xx.a
    FROM xx
    WHERE REGEXP_LIKE(xx.a, '^[[:digit:]]{3}-[[:digit:]]{2}\-[[:digit:]]{6}$');
    

    ...或使用[0-9] 代替[[:digit:]]

    WITH xx AS (
        SELECT '333-22-234223' AS a FROM dual
    )
    SELECT xx.a
    FROM xx
    WHERE REGEXP_LIKE(xx.a, '^[0-9]{3}-[0-9]{2}\-[0-9]{6}$');
    

    演示: http://sqlfiddle.com/#!4/3149e4/120/1


    为什么需要双括号?

    这些字符类仅在括号内的表达式内有效。
    来源: https://docs.oracle.com/cd/B12037_01/server.101/b10759/ap_posix001.htm

    【讨论】:

    【解决方案2】:

    @Sebastion Brosch 的替代品

    您可以将字符类 ([:digit:]) 替换为明确的数字范围,如下所示:

    with xx as
    (select '333-22-234223' as a
    from dual)
    select xx.a
    from xx
    where
    regexp_like(xx.a,'^[0-9]{3}-[0-9]{2}-[0-9]{6}$');
    

    【讨论】:

      【解决方案3】:

      为了完整起见,您也可以将\d 用于数字:

      with xx as
        (select '333-22-234223' as a
         from dual)
      select xx.a
      from xx
      where regexp_like(xx.a,'^\d{3}-\d{2}-\d{6}$');
      

      【讨论】:

        猜你喜欢
        • 2022-09-29
        • 2011-11-26
        • 1970-01-01
        • 2020-11-08
        • 1970-01-01
        • 2016-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多