REGEXP_LIKE - 查找包含特殊字符的模式

时间:2013-12-30 15:06:47

标签: sql regex oracle

我需要查找列值是否包含以下模式:

513-2400-23 - Valid
513-PBS-231 - Valid
521-PB-21 - Valid
52-12-21 - Valid
513-2321 - Not Valid

我尝试了以下版本和许多其他版本,但他们正在处理一个案例但不适用于其他案例。

SELECT CASE
    WHEN REGEXP_LIKE('B12-23-43', '.-.-.') THEN 'Y'
    ELSE 'N' END FROM DUAL;

3 个答案:

答案 0 :(得分:2)

假设有效模式只需要两个破折号,这应该有效:

SELECT CASE
    WHEN REGEXP_LIKE('B12-23-43', '^[^-]+-[^-]+-[^-]+$') THEN 'Y'
    ELSE 'N' END FROM DUAL;

模式要求字符串以一个或多个非短划线开头,然后是短划线,然后是一些非短划线字符,最后是一些非短划线字符。

Demo on sqlfiddle.

答案 1 :(得分:2)

Select Case WHEN REGEXP_LIKE('B12-23-43', 
              '^[[:alnum:]]{1,}-[[:alnum:]]{1,}-[[:alnum:]]{1,}$') THEN 'Y'
       ELSE 'N' END 
FROM DUAL;

<强>更新

还要涵盖此类案例:544-445-PBBTS-24.3,可以如下所示进行扩展:

Select Case When 
   Regexp_Like('B12-23-43', 
   '^([[:alnum:]]{1,}-){2}[[:alnum:]]{1,}(-[[:alnum:]]{1,}\.[[:alnum:]]{1,})?$') 
   THEN 'Y'
   ELSE 'N' END 
FROM DUAL;

答案 2 :(得分:0)

SELECT CASE
    WHEN (LEN('B12-23-43') - LEN(REPLACE('B12-23-43', '-', '')) = 2) THEN 'Y'
    ELSE 'N' END FROM DUAL;