Oracle DB中的正则表达式

时间:2018-11-01 13:29:07

标签: sql regex oracle

我正在尝试在表中使用REGEXP_LIKE来检查游戏的分数是否具有以下模式:

(1或2个数字)x(1或2个数字)

我试图使用此表达式

CONSTRAINT CK_PLACAR CHECK (REGEXP_LIKE (PLACAR, '^[[:digit:]]+x[[:digit:]]+$', 'i'))

但是我无法插入类似“ 1x0”的分数。我还尝试了其他一些选择,例如:

CONSTRAINT CK_PLACAR CHECK (REGEXP_LIKE (PLACAR, '^[[:digit:]]{1,2}x[[:digit:]]{1,2}$', 'i'));
CONSTRAINT CK_PLACAR CHECK (REGEXP_LIKE (PLACAR, '^[[:digit:]]*[[:digit:]]x[[:digit:]][[:digit:]]*$', 'i'));

我也尝试将[[:digit:]]更改为[0-9],但是它也不起作用。

这是我完整的表格:

CREATE TABLE PARTIDA (
TIME1 VARCHAR2(50) NOT NULL,
TIME2 VARCHAR2(50) NOT NULL,
DATA DATE NOT NULL,
PLACAR CHAR(5) DEFAULT '0x0',
LOCAL VARCHAR2(50) NOT NULL,
CONSTRAINT PK_PARTIDA PRIMARY KEY (TIME1, TIME2, DATA),
CONSTRAINT FK_PARTIDA FOREIGN KEY (TIME1, TIME2) REFERENCES JOGA(TIME1, TIME2),
CONSTRAINT CK_PLACAR CHECK (REGEXP_LIKE (PLACAR, '^[[:digit:]]+x[[:digit:]]+$', 'i'))
);

这是我的测试用例:

INSERT INTO PARTIDA VALUES ('TIME1', 'TIME2', SYSDATE, '1x0', 'ESTADIO1');

以下是输出:

  

从第1行开始的错误-   插入PARTIDA值('TIME1','TIME2',SYSDATE,'1x0','ESTADIO1')   错误报告 -   ORA-02290:违反了检查约束(K9012931.CK_PLACAR)

2 个答案:

答案 0 :(得分:1)

在{x1的两边,尝试'^\d{1,2}x\d{1,2}$'至少输入1位,但不要超过2位。

也许是语法?试试这个:

  ALTER TABLE score_table ADD (
    CONSTRAINT CK_PLACAR
    CHECK (REGEXP_LIKE (PLACAR, '^\d{1,2}x\d{1,2}$', 'i'))
    ENABLE VALIDATE);

编辑感谢kfinity的上述评论。使用具有CHAR(5)数据类型的PLACAR时,这是固定宽度的数据类型,因此,如果输入的数据少于5个字符,则会填充空格,导致其与正则表达式模式不匹配。要么将数据类型更改为可变宽度且首选的VARCHAR2(5),要么更改正则表达式以使结尾处可能有零个或多个空格:

'^\d{1,2}x\d{1,2} *$'

答案 1 :(得分:0)

就像Gary W的答案一样,您也可以对其进行修改,使其不接受像'0x'(01,02,03,...)之类的分数,而是接受0或仅接受1,2,3等。

^(?!0\d)\d{1,2}x(?!0\d)\d{1,2}$