Метасимвол регулярного выражения в SQL дает разные результаты в Oracle и Postgres - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь преобразовать некоторые запросы из среды Oracle в Postgres. Это упрощенная версия одного из запросов:

SELECT * FROM TABLE
  WHERE REGEXP_LIKE(TO_CHAR(LINK_ID),'\D')

Я считаю, что эквивалентный postgreSQL должен быть таким:

SELECT * FROM TABLE
    WHERE CAST(LINK_ID AS TEXT) ~ '\D'

Но когда я выполняю эти запросы в соответствующих средах для одного и того же набора данных, первый запрос не выводит записей (что правильно), а второй запрос выводит все записи в таблице. Я не писал оригинальный код, но, насколько я понимаю, он ищет любые значения в числовом поле LINK_ID, которые не являются цифрами. Должен ли метасимвол \ D вести себя по-разному в Oracle и Postgres? Я не вижу ничего в документации, чтобы сказать, что они должны.

1 Ответ

0 голосов
/ 04 мая 2018

Документация для Oracle TO_CHAR(number) состояний

Если вы опустите fmt, то n преобразуется в значение VARCHAR2 достаточно долго, чтобы содержать его значащие цифры.

Это означает, что единственным нецифровым символом, который может быть получен, является знак минус или десятичная точка. Если число положительное и не имеет дробной части, оно не будет соответствовать регулярному выражению \D.

С другой стороны, в PostgreSQL CAST( числовой (38,8) as TEXT) возвращает значение с количеством десятичных знаков, указанных в спецификации типа, в данном случае 8. E.g.:

cast( cast(12341234 as numeric(38,8)) as TEXT)

Генерирует 12341234.00000000 Результат такого приведения всегда будет содержать десятичную точку и, следовательно, всегда будет соответствовать регулярному выражению \D.

Вы можете обнаружить, что замена этого кода решит вашу проблему:

(LINK_ID % 1) <> 0.0

В качестве альтернативы, если вам нужно использовать регулярное выражение (например, для упрощения процесса миграции), рассмотрите возможность его изменения на '\.0*[1-9]', т. Е. Чтобы найти десятичную точку с любой ненулевой цифрой после нее.

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