Function – Retorna quantidade de um caracter de uma String
Hoje um colega aqui da empresa, precisava de uma função que
retorne a quantidades que um caracter aparece em uma determinada string.
Eu desconheço uma função do SQL que faça isso, portanto sugeri
que ele criasse uma user function para fazer essa validação.
Ai é que ta, sabemos que user functions podem dar uma boa
dor de cabeça pela sua péssima performance quando utilizadas em consultas que
retornam uma quantidade razoável de registros. Então, parei para pensar melhor para
ver qual seria a melhor maneira de fazer essa function.
Creio que a idéia inicial de todos seria fazer um loop na string,
correndo por todos os caracteres somando a quantidade de vezes em que o
caracter aparece na string. Algo mais ou menos assim:
DECLARE @Str VarChar(200),
@Caracter_A_Procurar VarChar(200),
@i Int,
@Qtde_Caracter Int;
SET @Str = ‘Um teste para validar
quantos caracteres existem nesta String’
SET @Caracter_A_Procurar = ‘a’
SET @i = 0
SET @Qtde_Caracter = 0
WHILE @i <= LEN(@Str)
BEGIN
IF SUBSTRING(@Str, @i, 1) = @Caracter_A_Procurar
SET @Qtde_Caracter =
@Qtde_Caracter + 1
SET @i = @i + 1
END
SELECT @Qtde_Caracter
Ok, o código acima funciona, mas pensando bem, existe outra
maneira bem mais eficiente de fazer esta validação. Que tal assim:
DECLARE @Str VarChar(200),
@Caracter_A_Procurar VarChar(200)
SET @Str = ‘Um teste para validar
quantos caracteres existem nesta String’
SET @Caracter_A_Procurar = ‘a’
SELECT LEN(@Str) – LEN(REPLACE(@Str,
@Caracter_A_Procurar, ”))
O código acima pega a string e faz um replace do caracter “a”
por nada, e depois verifica a quantidade de caracteres da string sem o “a” e
subtrai pela quantidade de caracteres original. O resultado será exatamente a
quantidade de vezes em que “a” aparece na string.
Fica ai a dica…
Essa do REPLACE foi bem bolada! Valeu a dica!
😉 Valeu Leandro!
ajudou muitoo… a do replace foi mega sacada!!! parabéns!!!!
Valeu!!!!
Abs.
Fabiano
Simples e muito eficiente, mandou bem!
Fabiano,
A um tempo atrás eu usei um exemplo justamente similar ao seu:
DECLARE @string VARCHAR(8000), @searchString VARCHAR(100);
SET @string = ‘abdceada’;
SET @searchString = ‘a’
SELECT LEN(@string) – LEN(REPLACE(@string, @searchString, ”));