【发布时间】:2018-11-01 13:29:07
【问题描述】:
我正在尝试在我的表中使用 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)
【问题讨论】:
-
我使用的是 Oracle 11g。
-
数字后面的加号表示 1 或更多,但您只在“x”的每一侧分配了 2 的大小。要么增加列的大小,要么限制正则表达式允许的内容。
-
在此处也添加此评论,以便您查看。将 PLACAR 列设为 VARCHAR2 而不是 CHAR,它应该可以工作。不要问我为什么。
-
@Gary_W 这是因为 CHAR 是固定宽度的 - 如果在这种情况下您不使用整个 5 个字节,您的数据会用空格右填充,这使得它无法通过正则表达式。跨度>
-
@kfinity 感谢您提供信息。如果我使正则表达式
'^\d{1,2}x\d{1,2} *$'允许填充 0 个或更多空格,就像你说的那样它有效。很高兴知道,但无论如何我都会坚持使用 VARCHAR2。