【问题标题】:Regular expression in Oracle DBOracle DB 中的正则表达式
【发布时间】: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。

标签: sql regex oracle


【解决方案1】:

尝试'^\d{1,2}x\d{1,2}$' 在“x”的任一侧至少有 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 的评论。 PLACAR 的数据类型为 CHAR(5),这是一个固定宽度的数据类型,因此如果输入的数据少于 5 个字符,则会用空格填充,导致它与正则表达式模式不匹配。要么将数据类型更改为可变宽度且首选的 VARCHAR2(5),要么更改正则表达式以在末尾允许可能的零个或多个空格:

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

【讨论】:

  • 我仍然遇到同样的错误。我编辑了我的问题,添加了完整的表格和测试用例。
【解决方案2】:

就像 Gary W 的回答一样,您也可以将其修改为不接受 '0x' (01, 02, 03, ...) 之类的分数,但接受 0 或仅接受 1、2、3 等。

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

【讨论】:

  • 对不起,我编辑了你的答案,而不是我自己的!呵呵但 Oracle 不支持负前瞻。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 2021-05-22
  • 2017-05-13
  • 1970-01-01
相关资源
最近更新 更多