Как сопоставить все символы, кроме правой четверти (закрытая квадратная скобка) с PatIndex SQL?

В приведенном ниже примере кода все результаты должны возвращать 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


person JohnLBevan    schedule 03.03.2016    source источник
comment
пс. Caret (^) также имеет интересное поведение. В этом примере экранирование как \^ сработало; однако мне не удалось воспроизвести это поведение, используя шаблон, использованный для вышеуказанного вопроса (например, patindex('%[^\^]%','111111^11')). stackoverflow.com/a/35779176/361842   -  person JohnLBevan    schedule 03.03.2016