sexta-feira, 13 de maio de 2011

Função para contar palavra

Gostaria de compartilhar com vocês um problema que tive de resolver a pouco tempo em um script SQL (que logo estarei postando para vocês esse script).

Enfim, meu problema era que precisava saber quantas vezes um determinado termo ou caracter aparecia em uma String. Precisava resolver esse problema através de uma função... por isso, segue abaixo um exemplo de solução:

 create function fc_conta_palavra(@palavra varchar(100),  
                                     @string varchar(max))  
 returns int  
 as  
 begin  
    -- declaração variáveis usadas na função  
    declare @contador int, @contadorpalavra int  
   
    --contador de quantas vezes apareceu a palavra  
    set @contadorPalavra = 0  
   
    --contador do loop  
    set @contador = 0  
   
    -- loop  
    while @contador <= len(@string)  
    begin  
   
       --se encontrar a palavra soma mais um para @contadorPalavra  
       set @contadorPalavra =  
          case when substring(@string, @contador, len(@palavra)) = @palavra  
             then @contadorPalavra + 1  
             else @contadorPalavra  
          end  
   
       --soma mais um ao contador do laço while  
       set @contador = @contador + 1  
   
    end  
   
    -- retorna valor  
    return @contadorPalavra  
 end  

Se alguém souber como resolver usando funções nativas do SQL Server, por favor, comentem a solução nesse post.

Bom, espero que tenham gostado!

2 comentários:

  1. Segundo os princípios do comando em SQL Server acima, Eu não apenas passei mas também adaptando para funções nativas do Oracle, reescrevendo para melhor performance na busca das palavras sem as restrições que são geradas no SQL Server... =D

    O código segui abaixo (espero que fique legível) :


    CREATE OR REPLACE Function fc_conta_palavra(palavras in nvarchar2,
    frase in long)
    return number as
    -- declaração variáveis usadas na função
    contador number(10) := 0; --contador do loop
    contadorpalavra number(10) := 0; --contador de quantas vezes apareceu a palavra
    textoatual long := frase; -- texto restante
    valorcorrente number(10) := 0; -- possição atual;

    -- loop
    begin
    while contador <= length(frase) loop

    --se encontrar a palavra soma mais um para contadorPalavra
    valorcorrente := INSTR(textoatual, palavras);

    if valorcorrente <= length(textoatual) and valorcorrente != 0 then
    contadorPalavra := contadorPalavra + 1;
    contador := valorcorrente + length(palavras); -- transfere valor
    textoatual := substr(textoatual, contador);
    else
    contador := length(frase) + 1;
    end if;

    end loop;

    -- retorna valor
    return contadorpalavra;
    end;

    -- valeu ai galera...

    ResponderExcluir
  2. Obrigado pela contribução Matheus!

    Também aproveito para lhe parabenizar pela iniciativa que você está tomando... fazendo você ter uma grande evolução em SQL... :)

    Compartilhe esse entusiasmo por tecnologia!

    Valeu!

    ResponderExcluir