Почему замена не выполняется при использовании PATINDEX для определенных специальных символов?

Мы пытаемся удалить определенные специальные символы из строки, используя приведенную ниже (упрощенную) команду, которая является наиболее распространенным решением, которое мы видели после поиска. Но результаты противоречивы при использовании определенных специальных символов. Кто-нибудь может объяснить, почему? И, лучше, может ли кто-нибудь предложить решение, которое работает?

SQL Server 2014

В первом случае ниже «@» удаляется, но во всех остальных случаях, когда он присутствует (2+5), он не удаляется. То же самое для 3-го случая: удаляются пробелы, но не '&'; а в 5-м случае удаляются пробелы, но не '@'. Другие комбинации имеют аналогичные проблемы.

Спасибо. объявить @str varchar(50) = '1st Ave @ 1st St FL-3 Rm 323& New York NY'

declare @Pindex1  varchar(10) = '%[@]%'
declare @Pindex2  varchar(10) = '%[@& ]%'
declare @Pindex3  varchar(10) = '%[& ]%'
declare @Pindex4  varchar(10) = '%[ ]%'
declare @Pindex5  varchar(10) = '%[@ ]%'

Select @str as String, @Pindex1 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex1,@str), 1), '') as PIndex1_result
Select @str as String, @Pindex2 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex2,@str), 1), '') as PIndex2_result
Select @str as String, @Pindex3 as Pattern ,Replace(@str, Substring(@str, PatIndex(@pindex3,@str), 1), '') as PIndex3_result
Select @str as String, @Pindex4 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex4,@str), 1), '') as PIndex4_result
Select @str as String, @Pindex5 as Pattern,Replace(@str, Substring(@str, PatIndex(@pindex5,@str), 1), '') as PIndex5_result

person LBerg    schedule 15.05.2017    source источник
comment
Не уверен, что вы ожидали. Большинство ваших шаблонов могут соответствовать нескольким возможным символам, patindex каждый раз находит первое совпадение, затем вы replace этот найденный символ из строки. Очевидно, что другие возможные совпадения (другие символы, которые может совпадать с шаблоном) вниз по строке остаются неизменными. Ваш второй шаблон недействителен (пытается определить диапазон от @ до space, должен быть '%[- @]%'), последний шаблон также недействителен (должен быть '%[ @]%'), но исправление шаблонов не решит проблему однократной материализации шаблона.   -  person GSerg    schedule 15.05.2017
comment
Вам нужно зацикливаться до тех пор, пока PatIndex не найдет больше совпадений.   -  person GSerg    schedule 15.05.2017
comment
Из того, что я видел, в цикле нет необходимости - он многократно соответствует любому экземпляру символа внутри [ ]. (Я не пытаюсь использовать функцию диапазона. В моем примере это была ошибка. См. Мой отредактированный вопрос.) Это то, что происходит с различными символами в нашем тестировании, но не с символом «@».   -  person LBerg    schedule 16.05.2017


Ответы (1)


Я думаю, у вас может быть неправильное понимание шаблонов SQL Server. Рассмотрим второй шаблон:

declare @Pindex2  varchar(10) = '%[@- ]%'

Это не может соответствовать шаблону. Почему? Значение ASCII для '@' равно 64, а для пробела — 32. Между этими значениями ничего не происходит. Он похож на '%[b-a]%', который также ничего не соответствует.

Я думаю, проблема в вашем понимании строковых шаблонов SQL Server.

person Gordon Linoff    schedule 15.05.2017
comment
Теперь я вижу проблему с символом «-». Я не пытался использовать диапазоны (что и делает «-»). Я пытался заменить каждый из символов внутри [ ]. Я немного отредактировал свои примеры, чтобы лучше показать эту проблему. - person LBerg; 15.05.2017