Função Para Contar Palavras (Padrão De Caracteres) Em Uma String Microsoft SQL Server

Categorias: desenvolvimento, sql

Salve galera!

Precisei durante essa semana de uma função que contasse quantas vezes uma palavra aparecia dentro de uma String no SQL Server. Achei que já tivesse algo pelo menos similar, mais após andar pelo MSDN e pelo Books Online vi que o jeito seria fazer uma função.

A lógica é a seguinte:

  • Recebo via Parâmetro a Palavra que quero buscar e a String toda ou texto.
  • Faço um loop baseado no tamanho do texto.
  • Pego o tamanho da palavra que está sendo procurada e a cada caracter do texto, andamos o tamanho da palavra e comparamos se isso é igual a palavra procurada.
  • Se for, soma um no contador de palavras e continua.

Agora como fica o código disso? Repare abaixo:

CREATE FUNCTION CountSearchPat
(
      @Word Varchar(100),
      @String Varchar(Max)
)
RETURNS int
AS
BEGIN
 
      -- Declaração Variáveis
      Declare @Count int, @CountWord int
 
      -- Contador de quantas vezes apareceu a palavra
      Set @CountWord = 0
 
      -- Contador do Loop
      Set @Count = 0
 
      -- Loop
      While @Count <= Len(@String)
      Begin
 
            -- Se encontrar a palavra soma mais um para @CountWord
            Set @CountWord =
                  Case When Substring(@String, @Count, Len(@Word)) = @Word
                        Then @CountWord + 1
                        Else @CountWord
                  End
 
            -- Soma mais um ao contador
            Set @Count = @Count + 1
 
      End
 
      -- Retorna Valor
      Return @CountWord
 
END

Repare no loop da linha 30 que tem seu contador baseado no tamanho da String inteira, para percorrer cada caracter.

Na linha 24 temos uma variável que seu valor depende do CASE onde, se a partir daquele caracter for encontrada a palavra, soma mais um, senão continua com o mesmo valor.

Na linha 31 temos a soma do contador do loop. E então o retorno do valor da função.

Agora é só testar.
Por Exemplo: Select dbo.SearchStringPat(‘teste’, ‘aatestehstestehjkteste’)
O resultado será 3.

Agora reflita comigo no próximo Exemplo sugerido pelo meu Brother Hernando Santana:
Você tem uma String da seguinte maneira ‘AAAAA’ e procura pelo padrão ‘AA’. Qual valor irá retornar ?

A função criada aqui irá retornar 4. A resposta é uma questão de conceito. Eu ando caracter por caracter atrás da palavra. Podemos fazer andar a partir da palavra encontrada adicionando mais algumas variáveis sem problema e fazendo retornar o valor 2. Para minha necessidade não fazia diferença a princípio.

Idéia simples que resolveu os problemas do dia.
Até a Próxima! Abraços!


Comments