Как экранировать специальные символы из предложения SQL LIKE? - PullRequest
0 голосов
/ 26 марта 2020

Я использую руководство на https://www.baeldung.com/rest-api-search-language-rsql-fiql для построения спецификации JPA на основе R SQL.

Предложение like выглядит следующим образом:

return builder.like(root.get(property), argument.toString().replace('*', '%'));

Мой вопрос: как лучше всего обрабатывать экранирование специальных символов при вводе пользователем?

Например, если пользователь предоставил строку:

*my-search%-term*

приведенный выше код перевел бы это на:

%my-search%-term%

Я бы хотел экранировать % в строке, чтобы он не оценивался как подстановочный знак % в предложении LIKE.

В следующем посте указаны специальные символы LIKE для каждой базы данных:

Список специальных символов для предложения SQL LIKE

, а также примечание комментарий из одного из ответов:

Невозможно написать независимый от СУБД код здесь, потому что вы не знаете, какие символы вы должны будете экранировать, а стандарт говорит, что вы не можете избегать вещей, которые не нужно избегать. (См. Раздел 8.5 / Общие правила / 3.a.ii.)

Мне интересно, как лучше всего справиться с этим? Я использую postgres в производстве и h2 в тестировании, но в идеале не хочу, чтобы решение было привязано ни к одному из них.

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

В стандартном SQL вам нужно только экранировать символы % и _, так как это единственные символы подстановки, поддерживаемые оператором LIKE.

Так что *my-search%-term* следует использовать следующим образом в SQL

WHERE some_column LIKE '%my-search\%-term%' escape '\'
0 голосов
/ 26 марта 2020

Почему бы не использовать сопоставление регулярных выражений вместо like?

where col ~ <user input>

Похоже, ваши пользователи могут быть более знакомы с регулярными выражениями.

Если вы просто хотите точное совпадение который игнорирует все подстановочные функции, вы можете использовать положение:

where position(<user input> in col) > 0
...