Избегайте специальных символов для Oracle и SQL Server в одном запросе - PullRequest
0 голосов
/ 22 января 2019

У меня следующий запрос:

SELECT *
FROM PRODUCTS
WHERE REDUCTION LIKE '50%'

Мне необходимо использовать предложение LIKE. Этот запрос должен выполняться как на Oracle, так и на SQL Server.

Теперь есть проблема, потому что я хочу сопоставить все продукты со снижением на 50%. Но данные могут содержать сокращение на 50,50%. Поскольку «%» - это специальный символ, он соответствует им обоим.

Я хочу экранировать все специальные символы, такие как % в моем запросе, чтобы я получал продукты только с 50% сокращением.

Существует ли единообразное решение для экранирования специальных символов в динамическом режиме как для Oracle, так и для сервера SQL?

Использование обратной косой черты не является решением, потому что на практике мы не знаем, какой будет ввод.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

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

Но если:

  • пользователям разрешено вводить символы подстановки;
  • и вам нужно использовать LIKE;
  • и вы не хотите, чтобы с ними обращались как с подстановочными знаками;

тогда вам нужно как-то избежать их.

Возможно, вы можете зарезервировать некоторого знакомого вам персонажапользователь не будет нуждаться в этом и будет использовать этот escape-символ.

Насколько я могу сказать в Oracle, вам нужно только экранировать проценты (%) и нижнюю черту (_) SQL Server вы также должны учитывать скобки .

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

0 голосов
/ 22 января 2019

Предложение ESCAPE работает в Oracle и SQL Server .

Что касается вашего ввода, вам нужно заменить все вхождения % на \% (желательно перед передачей значения в RDBM).Вы можете сделать это и внутри запроса, поскольку, к счастью, функции Oracle REPLACE и SQL Server REPLACE имеют одинаковую сигнатуру:

CREATE TABLE tests(test VARCHAR(100));
INSERT INTO tests VALUES('%WINDIR%\SYSTEM32');
SELECT *
FROM tests
WHERE test LIKE REPLACE(REPLACE('%WINDIR%\SYSTEM32', '\', '\\'), '%', '\%') ESCAPE '\'
0 голосов
/ 22 января 2019

Предложение ESCAPE идентифицирует обратную косую черту (\) как escape-символ

SELECT *
FROM PRODUCTS
WHERE REDUCTION LIKE '50\%'
...