Экранирование в ILIKE-запросе - PullRequest
0 голосов
/ 13 октября 2008

Мне нужно выполнить запрос, который ищет текст с 'Nome% teste \ /' в качестве префикса. Я делаю запрос, используя:

где "name" ILIKE 'Nome a% teste \ /%' ESCAPE 'a' (с использованием escape-символа).

Есть строка, которая соответствует этому, но этот запрос ничего не возвращает. Сняв косую черту ( 'Nome% teste \' ), все работает. Но я не понимаю, почему косая черта является проблемой, поскольку экранирование по умолчанию - обратная косая черта , и я изменил его на 'a' в этом тест.

Есть что-то, чего мне не хватает? (Я консультировался с TFM)

Ответы [ 2 ]

2 голосов
/ 13 октября 2008

Используйте спецификатор "ESCAPE"

WHERE "name" ILIKE 'Nome ~% teste \\/' ESCAPE '~' 

http://www.postgresql.org/docs/8.2/static/functions-matching.html

Примечание: вам все еще нужно иметь \ дважды для парсера строк.

Без ESCAPE вам нужно было бы сделать

WHERE "name" ILIKE 'Nome \% test \\\\/' 

(4 для представления одного литерала \)


Спасибо, но у меня все еще есть оригинальная проблема с косой чертой. Поиск с

WHERE "name" ILIKE 'Nome \% test \\\\/%' 

не дайте мне результата, пока

WHERE "name" ILIKE 'Nome \% test \\\\%' 

(убрал косую черту, которая присутствует в строке) работает как положено. - Kknd

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

Я бы попытался использовать это для проверки этого возможного сценария

 WHERE "name" ILIKE 'Nome \% ' AND "name" ~* '\\.{1,10}/' 

, который вернет строки, которые чем-то отделены (но не строки без разделения)

1 голос
/ 13 октября 2008

Вы пытались использовать обратную косую черту, чтобы убежать от нее так:

where "name" ILIKE 'Nome \% teste \\\/';
...