REGEXP_LIKE 上的 Oracle 案例返回 false 而不是 true

问题描述 投票:0回答:1

我有这个疑问

select
    documentat2_.*
    ,case
            when (
                REGEXP_LIKE(documentat2_.VALUE,'^(\\*)$')
            ) then 1
            else 0
        END AS x
from
    DOCUMENT_ATTRIBUTE_BANK documentat1_
inner join
    DOCUMENT_ATTRIBUTE documentat2_
        on documentat1_.DOCUMENT_ATTRIBUTE_ID=documentat2_.DOCUMENT_ATTRIBUTE_ID
where
    exists  (
       select
            documenten0_.DOCUMENT_ID as document_id2_8_
            FROM 
             DOCUMENT documenten0_
        where
            documenten0_.APPLICATION_CODE='xxx' AND 
        documentat1_.DOCUMENT_ID=documenten0_.DOCUMENT_ID
        and documentat1_.DOCUMENT_VERSION=documenten0_.DOCUMENT_VERSION
    )
    and documentat1_.DOCUMENT_VERSION=16
    and documentat1_.BANK_ID='xxxx'
    and documentat2_.CHECKLIST_ID=7
    and documentat2_.NAME='NEW'
    AND documentat2_.VALUE='*'

查询选择与字段

VALUE=' * '
匹配的记录,它工作正常,但是
REGEXP_LIKE
返回
0
!我的期望是
1
,而不是
0
!它适用于
REGEXP_LIKE(documentat2_.VALUE,'(\\ *)')
但不适用于
REGEXP_LIKE(documentat2_.VALUE,'^(\\ *)$')
,为什么? 在其他情况下
REGEXP_LIKE(documentat2_.VALUE, '^(NO)$|^(\\*)$')
它可以工作,因为某些记录的值带有
"NO"
,而另一些记录则带有
"*"
。我想字段中没有空格,所以我不明白为什么它会这样工作?

出了什么问题,还是我错了? 我很困惑..

谢谢

regex oracle oracle11g ansi-sql-92
1个回答
0
投票

^(\\*)$
匹配:

  • 字符串的开头
    ^
  • 捕获组的开始
    (
  • 零个或多个
    \
    反斜杠字符
    \\*
  • 捕获组结束
    )
  • 字符串结尾
    $

它与

*
字符不匹配。

如果您想匹配

*
,请使用单个反斜杠来转义
*
字符:

select documentat2_.*
     , case
       when (REGEXP_LIKE(documentat2_.VALUE,'^\*$'))
       then 1
       else 0
       END AS x
from   -- ...
       DOCUMENT_ATTRIBUTE documentat2_
where  -- ...
       documentat2_.VALUE='*'

对于样本数据:

CREATE TABLE DOCUMENT_ATTRIBUTE (value) AS
SELECT '*' FROM DUAL UNION ALL
SELECT '  *  ' FROM DUAL UNION ALL
SELECT 'NO' FROM DUAL;

输出:

价值 X
* 1

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.