2016-11-23 2 views
1

я заметил, что производительность для фильтра в Oracle может быть очень разным в зависимости от написать ли выЛюбая функция, ускользающая от строки для литерального поиска LIKE?

WHERE col LIKE 'abc%' 

или

WHERE SUBSTR(col,1,3) = 'abc' 

Итак, я хотел бы всегда использовать LIKE запросов. Но мой префикс может содержать любой символ ASCII, и поэтому мне нужно избежать %, _ и сам escape-символ.

  • Я мог бы использовать regexp_replace что-нибудь подобное:

    WHERE col LIKE REGEXP_REPLACE(pat, '([%_\\])', '\\\1') || '%' ESCAPE '\' 
    
  • Я мог бы также сделать тройной ЗАМЕНА:

    WHERE col LIKE REPLACE(REPLACE(REPLACE(pat,'\','\\'),'%','\%'),'_','\_') || '%' ESCAPE '\' 
    

Оба способа являются болезненными для парня который будет читать его впоследствии. Есть ли альтернативная функция, в стиле WHERE begins_with(col, pat) > 0, или WHERE col LIKE like_literal(pat) || '%', или мне нужно написать ее самостоятельно?

+1

'pat', кажется, откуда-то еще. Измените его, прежде чем передавать его в запрос. –

ответ

1

Вы можете определить свой собственный символ эвакуации.

WHERE col LIKE 'A\_B%' ESCAPE '\'; 

В шаблоне символ пробега предшествует подчеркиванию (_). Это заставляет Oracle интерпретировать символ подчеркивания буквально, а не как особый символ соответствия шаблону.

Пожалуйста, прочтите следующую ссылку https://docs.oracle.com/cd/B12037_01/server.101/b10759/conditions016.htm

+0

Вы имели в виду 'WHERE col LIKE 'A \ _B%' ESCAPE '\';'? –

+0

@MatthewMcPeak, да он это сделал, это проблема с отступом уценки – Benoit

+0

Я уже знаю, что символ escape можно выбрать. Моя проблема заключается в том, чтобы знать, есть ли удобная функция для правильного выхода из строковой строки, если я хочу удалить какое-либо особое значение для '%' и '_' без разворачивания моей тройной замены или замены regexp. – Benoit

Смежные вопросы