Как преобразовать код PostgreSQL в Oracle SQL

#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');