Регулярное выражение в БД Oracle - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь использовать 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 в команде - INSERT INTO PARTIDA VALUES ('TIME1', 'TIME2', SYSDATE, '1x0', 'ESTADIO1') Сообщение об ошибке - ORA-02290: проверка ограничения (K9012931.CK_PLACAR) нарушена

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Точно так же, как ответ Гэри У, вы также можете изменить его так, чтобы он не принимал оценки, такие как «0x» (01, 02, 03, ...), но принимал 0 или просто 1, 2, 3 и т. Д.

^(?!0\d)\d{1,2}x(?!0\d)\d{1,2}$
0 голосов
/ 01 ноября 2018

Попробуйте '^\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 выше. С PLACAR, имеющим тип данных CHAR (5), это тип данных фиксированной ширины, поэтому, если введенные данные содержат менее 5 символов, они дополняются пробелами, в результате чего они не соответствуют шаблону регулярных выражений. Либо измените тип данных на VARCHAR2 (5), который является переменной шириной и предпочтительным, или измените регулярное выражение, чтобы учесть возможный ноль или более пробелов в конце:

'^\d{1,2}x\d{1,2} *$'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...