Преобразовать функцию Oracle regexp_instr в Posgresql - PullRequest
0 голосов
/ 31 декабря 2018

Я столкнулся с функцией Oracle при преобразовании схемы Oracle 11g в Postgresql 11 следующим образом:

ADD CONSTRAINT valid_session_time_zone CHECK (regexp_instr(trim(both session_time_zone),'(\+|\-|\s)?(0?[0-9]|1[01234])(:[0-5]\d)')=1);

Поэтому я перевожу это как DOMAIN postgresql 11

CREATE DOMAIN chk_time_zone AS VARCHAR CHECK ( VALUE ~* '(\+|\-|\s)?(0?[0-9]|1[01234])(:[0-5]\d)');

, но какобрезать обе стороны строки заранее в моем доменном выражении?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Возможно, это просто мое плохое зрение, но мне кажется, что в исходном коде есть проблема.Исходное регулярное выражение требует, чтобы соответствующая строка начиналась с одного из +, - или пробела, но вызов TRIM удалит все начальные пробелы.Таким образом, если соответствующая строка начинается с пробела, который после него не имеет + или -, вызов TRIM удалит пробел, и, следовательно, шаблон не будет совпадать.Моя рекомендация состоит в том, чтобы просто игнорировать тот факт, что вызов TRIM есть, потому что он кажется потенциальной ошибкой, и продолжить сопоставление как ~* '(\+|\-|\s)?(0?[0-9]|1[01234])(:[0-5]\d)'.

0 голосов
/ 31 декабря 2018

Ваша проверка Oracle не манипулирует данными, введенными в таблицу, она просто проверяет, соответствует ли ее усеченная версия шаблону, поэтому ясно, что можно вставлять начальные / конечные пробелы или что-то еще где-то их обрезает ...

Таким образом, я думаю, вы можете попросить PGSQL игнорировать начальные / конечные пробелы, разрешив его в шаблоне:

CREATE DOMAIN chk_time_zone AS VARCHAR CHECK 
( VALUE ~* '\s*(\+|\-|\s)?(0?[0-9]|1[01234])(:[0-5]\d)\s*');

Обратите внимание, что введенное регулярное выражение не содержит привязок к началуили конец, так что шаблон может возникнуть в любом месте данных для совпадения.Добавьте ^ в начале и $ в конце регулярного выражения, если ввод должен полностью соответствовать шаблону

Например: 'abcdef' соответствует '[cd]+', но не '^[cd]+$'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...