Как преобразовать код postgreSQL в Oracle SQL - PullRequest
0 голосов
/ 05 марта 2019

У меня есть несколько строк кода в 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 ~ '^[.]|[.]$';

У меня проблемы с преобразованием ~ и правой (file_name, -1) части кода для запуска их в sql developer.

Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 05 марта 2019

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 просто избыточно.

1 голос
/ 05 марта 2019

Вместо Postgres right() вам нужно использовать Oracle substr () и вместо ~ (регистрозависимые регулярные выражения типа оператора) функция 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...