Uma LIKE
cláusula pode testar se uma string ocorre em outra e a CHARINDEX
função pode fornecer a posição inicial da primeira correspondência.
No meu caso, estou interessado na posição final , que é, devido aos meandros dos agrupamentos, não derivável do local inicial. Por exemplo, em um agrupamento alemão ( German_PhoneBook_100_CI_AS_SC_UTF8
),
hä
ocorre em 'Häger' na posição 1 e termina na posição 2 ehä
ocorre em 'Haeger' na posição 1 e termina na posição 3.
O problema disso é marcar a parte correspondente de um texto de resultado de pesquisa para o benefício dos usuários.
Eu estive pensando em inverter as cordas, mas ainda posso obter apenas a primeira correspondência CHARINDEX
e, nesse caso invertido, precisaria da última.
Alguma ideia alguém?
A seguir está uma nova tentativa que acredito funcionar, mas é muito mais hacky do que a primeira que foi postada nesta resposta.
Com base na ideia de usar
replace
, mas tendo que lidar com o fato de quereplace
substitui tudo e não apenas a primeira ocorrência, agora substituo as correspondências por algo contendo um separador identificável que posso encontrarcharindex
para separar o resto. Eu posso então remover o resto e ver o comprimento do resto.No entanto, vamos fazer as seguintes suposições para tornar nossa vida um pouco mais fácil, ela fica complicada o suficiente mesmo com essas restrições em vigor:
Primeiro, aqui está uma versão programática:
O restante mostra como
hae
, que também nos informa a posição final por seu comprimento.Aqui está a expressão embutida:
CHARINDEX dará o dardo de uma partida. Use STUFF para inserir @sep. Isso vai quebrar a partida. Avance um lugar de cada vez até que a partida seja restaurada. Isso dará o fim da fonte.
Assim, a partida se estende da posição 1 à 3 inclusive.
Se houver várias correspondências na string original, isso será exibido após a primeira vez que @sep for preenchido. Nesse caso, o original pode ser truncado de lá e pesquisado dessa maneira.
Não posso digitar isso corretamente no momento. Talvez amanhã. Espero que seja útil mesmo assim.