Мы пытаемся удалить определенные специальные символы из строки, используя приведенную ниже (упрощенную) команду, которая является наиболее распространенным решением, которое мы видели после поиска. Но результаты противоречивы при использовании определенных специальных символов. Кто-нибудь может объяснить, почему? И, лучше, может ли кто-нибудь предложить решение, которое работает?
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
patindex
каждый раз находит первое совпадение, затем выreplace
этот найденный символ из строки. Очевидно, что другие возможные совпадения (другие символы, которые может совпадать с шаблоном) вниз по строке остаются неизменными. Ваш второй шаблон недействителен (пытается определить диапазон от@
доspace
, должен быть'%[- @]%'
), последний шаблон также недействителен (должен быть'%[ @]%'
), но исправление шаблонов не решит проблему однократной материализации шаблона. - person GSerg   schedule 15.05.2017PatIndex
не найдет больше совпадений. - person GSerg   schedule 15.05.2017