akkuch
@akkuch

Экранированный backslash и ILIKE

Добрый день!

select '%123\\456%'
ожидаемо выдает строку %123\456%

Однако запрос
select '123456' ilike '%123\\456%'
неожиданно дает true.

Контекст такой: ищем по номеру документа, номер не содержит слеша, в запрос слеш (экранированный, как и в примере) есть. Документ находится, хотя вроде не должен. В этом сходятся как клиент pgAdmin, так и Hibernate.

В чем может быть проблема?
  • Вопрос задан
  • 3753 просмотра
Решения вопроса 1
@EvilHedgehog
Проблема в том, что в '%123\\456%' на самом деле нет бэкслеша ;)
Бэкслеш уже экранирующий символ в строках, и чтобы запихать один в строку, приходится писать его два раза. Но в 'like' он тоже экранирующий символ, поэтому чтобы заматчить один бэкслеш лайком, его тоже надо экранировать. Итого, чтобы заматчить один бэкслеш, его надо написать аж четыре раза. Т.е. как-то так:

plesk=> select E'\\' like E'%\\%';
?column?
— f
(1 row)

plesk=> select E'\\' like E'%\\\\%';
?column?
— t
(1 row)

Ну или указать другой экранирующий символ:
plesk=> select E'\\' like E'%\\%' escape '#';
?column?
— t
(1 row)

Так что если с четырьмя слешами документ не найдет, то все в порядке :)

Вот тут про это написано, 9.7.1: www.postgresql.org/docs/8.0/static/functions-matching.html
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы