Патиндекс mssql для символа ]

Как указать символ ] внутри класса символов (функция MS SQL SERVER PATINDEX)?

'%["[]%' - for starting bracket - it works
'%["]]%' - for ending - it does not

person wUser    schedule 04.09.2018    source источник
comment
Возможный дубликат SQL Server LIKE, содержащий скобки   -  person snipsnipsnip    schedule 04.09.2018
comment
PATINDEX нельзя использовать с ключевым словом ESCAPE, как с LIKE.   -  person wUser    schedule 04.09.2018
comment
Ты прав. Соответствует ли этот вопрос DBA.SE о закрывающей квадратной скобке помочь? Вы можете найти обходной путь там.   -  person snipsnipsnip    schedule 05.09.2018


Ответы (2)


Похоже, что в PATINDEX невозможно правильно выйти из закрывающей скобки (]). ] может быть написано дословно, но не может быть включено в набор символов.

Однако, согласно этому вопросу DBA.SE есть обходной путь (полный пример см. в связанной статье):

  1. Укажите диапазон символов, содержащий ]. (обратите внимание, что это будет соответствовать нежелательным символам)
PATINDEX('%[[-^{}:,]%' COLLATE Latin1_General_BIN2, MyJSONString)
  1. Применить REPLACE перед сопоставлением.
PATINDEX('%[[' + CHAR(174) + '@]%', REPLACE(@test,']',CHAR(174)))
  1. Используйте PATINDEX дважды: один для ], а другой для остальных символов.
(NULLIF(PATINDEX('%[[{}:,]%', d.ResponseJSON), 0), NULLIF(PATINDEX('%]%', d.ResponseJSON), 0)))
person snipsnipsnip    schedule 05.09.2018
comment
№ 1, кажется, тот, который я ищу. № 2 не может быть обходным путем. В JSON может быть символ ] как текст, а не как закрывающая скобка массива. № 3 ищет два раза. - person wUser; 05.09.2018

После тестирования различных вариантов, это, похоже, сработало, как и ожидалось. Попробуйте.

PATINDEX('%[^]]%', 'test[test]') +1

+1 добавлен, потому что в каждом тесте, который я выполнял, он всегда останавливался на один символ перед закрывающей скобкой], это гарантирует захват открытых и закрывающих позиций.

Попробуйте, дайте мне знать, что вы думаете.

person Goku    schedule 31.07.2020