#sql #regex #oracle
#sql #регулярное выражение #Oracle
Вопрос:
У меня есть несколько строк кода в PostgreSQL, которые я хотел бы использовать для запроса базы данных Oracle с теми же таблицами и столбцами.
Однако код postgres не работает в sql developer и возвращает ошибку. Код выглядит следующим образом:
SELECT * FROM file WHERE file_name IS NOT NULL
AND file_name ~ '[u0000-u001f]|^$|^ | | $';
И
SELECT * FROM file WHERE file_name IS NOT NULL AND
CASE WHEN file_name LIKE '\%' THEN right(file_name, -1)
ELSE file_name END ~ '^[.]|[.]$';
У меня возникли проблемы с преобразованием ~ и правильной (имя_файла, -1) частей кода для их запуска в sql developer.
Любая помощь приветствуется.
Ответ №1:
right()
с отрицательным аргументом в Postgres используется довольно редко. Но эквивалентом в Oracle было бы substr(x, 2)
, поэтому один из методов:
SELECT *
FROM file
WHERE file_name IS NOT NULL AND
REGEXP_LIKE(CASE WHEN file_name LIKE '\%' THEN substr(file_name, 2)
ELSE file_name
END), '^[.]|[.]$');
Однако я бы сделал это, используя одно регулярное выражение в любой базе данных:
WHERE REGEXP_LIKE(file_name, '^(\)?[.]|[.]$');
Я не вижу никаких преимуществ в использовании case
при выполнении этого типа сопоставления регулярных выражений. Сравнение с NULL
просто избыточно.
Ответ №2:
Вместо Postgres right()
вам нужно использовать Oracle substr()
и вместо ~
(регулярных выражений с учетом регистра, таких как operator) regexp_like() функция с 'c'
в качестве аргумента 3d (что означает, что регистр чувствителен, хотя может быть опущен):
SELECT * FROM file
WHERE
file_name IS NOT NULL
AND
REGEXP_LIKE(
CASE
WHEN file_name LIKE '\%' THEN substr(file_name, 2)
ELSE file_name
END, '^[.]|[.]$', 'c');