В приведенном ниже примере кода все результаты должны возвращать 7.
Однако те, чьи псевдонимы начинаются с X, этого не делают.
select
--where matches
patindex('%-%' ,'111111-11') dash --not a special character, so works without escaping
,patindex('%[%' ,'111111[11') xLeftCrotchet --special character [ not escaped; works
,patindex('%[[]%','111111[11') leftCrotchetEscaped --special character [ escaped to [[]; doesn't work
,patindex('%]%' ,'111111]11') rightCrotchet --special character ] not escaped; doesn't work
,patindex('%[]]%','111111]11') xRightCrotchetEscaped --special character ] escaped to []]; also doesn't work
--where doesn't match
,patindex('%[^-]%' ,'------1--') dash --not a special character, so works without escaping
,patindex('%[^[]%' ,'[[[[[[1[[') leftCrotchet --special character [ not escaped; works
,patindex('%[^[[]]%','[[[[[[1[[') xLeftCrotchetEscaped --special character [ escaped to [[]; doesn't work
,patindex('%[^]]%' ,']]]]]]1]]') xRightCrotchet --special character ] not escaped; doesn't work
,patindex('%[^[]]]%',']]]]]]1]]') xRightCrotchetEscaped --special character ] escaped to []]; also doesn't work
В некоторых случаях имеет смысл, почему это не работает; то есть, когда специальный символ не был правильно экранирован.
Однако для левого крючка нужно ли его экранировать или нет, зависит от того, следует ли он за символом вставки (т. е. сопоставляем ли мы этот символ или все символы, кроме этого символа).
Кажется, что для правого крючка нет способа сопоставить все символы, кроме правого крючка; то есть нет простого способа избежать этого символа.
NB: в этом сообщении говорится, что квадратные скобки не нужно экранировать; но это не тот случай (один сценарий из) приведенного выше примера. экранировать квадратные скобки в PATINDEX с SQL Server
^
) также имеет интересное поведение. В этом примере экранирование как\^
сработало; однако мне не удалось воспроизвести это поведение, используя шаблон, использованный для вышеуказанного вопроса (например,patindex('%[^\^]%','111111^11')
). stackoverflow.com/a/35779176/361842 - person JohnLBevan   schedule 03.03.2016