Contar Letras de cada palavras em uma String

784 views
Skip to first unread message

Alexandre Fadul

unread,
Feb 10, 2014, 1:44:13 PM2/10/14
to sqlse...@googlegroups.com
Prezados,

Preciso contar a quantidade de letras de cada palavra de uma string.

Tenho a necessidade de saber se existe uma string com uma "palavra" que contenham 3 ou menos letras.

Ex:
String: "Contar Letras nas Palavras"
Resultado: "6 6 3 8"

String: "SQL SERVER DF É DEMAIS"
resultado: "3 6 2 1 6 "

Alguém sabe uma função ou método para isso?

Obrigado!

Marcos Antonio Felisberto

unread,
Feb 10, 2014, 1:56:09 PM2/10/14
to sqlse...@googlegroups.com
cara....

na boa, pensei que era um lance de numerologia....


--
 
---
You received this message because you are subscribed to the Google Groups "SQLServerDF" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sqlserverdf...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.



--

Enviado via iPhone

Renato NEI SANTOS

unread,
Feb 10, 2014, 2:01:02 PM2/10/14
to sqlse...@googlegroups.com
LEN ( string_expression )
ou seja len ( "Contar Letras nas Palavras")

Renato Nei Santos
Trab: 39662110
Cel: 86294609


Em 10 de fevereiro de 2014 16:44, Alexandre Fadul <xande...@gmail.com> escreveu:

--

Lucas Benevides

unread,
Feb 10, 2014, 2:01:44 PM2/10/14
to sqlse...@googlegroups.com
Alexandre,
 
Tem uma função que eu uso muito que faz o Split.
 
Aí depois, você pode declarar um cursor para uma query feita sobre esta função
DECLARE CURSOR cur_name FOR SELECT tid, value from dbo.fn_split (String, ' ')
 
Aí você simplesmente abre o cursor e testa o LEN(value). Se for menor ou igual a três, tome sua ação.
 
Abraço,
Lucas Benevides
DBA CAbuloso
 
 

Renato Cantarino

unread,
Feb 10, 2014, 2:02:50 PM2/10/14
to sqlse...@googlegroups.com
SELECT len('XXXXXX')

Att,
Renato Cantarino

Marcos Antonio Felisberto

unread,
Feb 10, 2014, 2:05:01 PM2/10/14
to sqlse...@googlegroups.com
Pessoal

O cara quer saber a quantidade de letras em cada palavra SEPARADAMENTE.

E não pode contar os espaços.

<trecho original>
Ex:
String: "Contar Letras nas Palavras"
Resultado: "6 6 3 8"

String: "SQL SERVER DF É DEMAIS"
resultado: "3 6 2 1 6 "
<fim trecho original>

Leonardo Pedroso Costa

unread,
Feb 10, 2014, 2:06:46 PM2/10/14
to sqlse...@googlegroups.com
Eu nao sei como fazer, mas começaria tentando por substring e patindex e usaria algumas variáveis de controle.

Leonardo Pedroso Costa
DBA SQL Server
Belo Horizonte - MG

Advaldo de Paiva Moreira

unread,
Feb 10, 2014, 2:09:06 PM2/10/14
to sqlse...@googlegroups.com
substring + patindex + charindex e um while....
Estou sem ambiente e sem acesso a meu ambiente, mas eu já fiz isso....

Marcos Antonio Felisberto

unread,
Feb 10, 2014, 2:09:56 PM2/10/14
to sqlse...@googlegroups.com
Eu também iria por aí....

To vendo o link que o Lucas mandou pra "clarear".

E realmente só vejo como fazendo um procedimento que "quebre" a string pegando apenas as palavras, contando e retornando um array com os quantitativos.

Advaldo de Paiva Moreira

unread,
Feb 10, 2014, 2:20:58 PM2/10/14
to sqlse...@googlegroups.com
para dar uma luz maior ainda:
digitando pelo celular, entao, por favor, se alguem achar um erro, pode corrigir?


DECLARE @TextoLinha VARCHAR(500) , @Caracter VARCHAR(1), @QTDE INT
SET @Caracter =' ' 
SET @TextoLinha ='ADVALDO PAIVA MOREIRA'  


SELECT LEN(@TextoLinha) - LEN(REPLACE(@TextoLinha, @Caracter, '')) -- QUANTIDADE DE ESPACOS PARA O WHILE

SELECT @QTDE = (LEN(@TextoLinha) - LEN(REPLACE(@TextoLinha, @Caracter, '')))

SELECT PATINDEX('% %', @TextoLinha) -- CONTA OS CARACTERES DEPOIS DO WHILE


Advaldo de Paiva Moreira

unread,
Feb 10, 2014, 3:07:38 PM2/10/14
to sqlse...@googlegroups.com
Exemplo com 3 nomes:
Melhora-se colocando o while para contar quantas palavras tem o nome da pessoa.
Vou tentar fazer mais tarde.

declare @valor1 varchar(30) = 'ADVALDO'
declare @valor2 varchar(30) = 'PAIVA'
declare @valor3 varchar(30) = 'MOREIRA'

select len(@valor1) , len(@valor2), len(@valor3)


declare @table table (nome varchar(max))
insert into @table values ('ADVALDO PAIVA MOREIRA')

SELECT LEN
(SUBSTRING(nome -- CAMPO
, 1 -- INICIO
,(SELECT PATINDEX('% %', nome))) -- ESPAÇO
FROM @table


update @table 
set nome =  replace(nome, (CASE WHEN CHARINDEX(' ',nome) > 0 
THEN LEFT(nome, CHARINDEX(' ',nome)-1) 
ELSE nome END ) , ' '
)

update @table 
set nome =  replace (nome, '  ','')


SELECT LEN
(SUBSTRING(nome -- CAMPO
, 1 -- INICIO
,(SELECT PATINDEX('% %', nome))) -- ESPAÇO
FROM @table


update @table 
set nome =  replace(nome, (CASE WHEN CHARINDEX(' ',nome) > 0 
THEN LEFT(nome, CHARINDEX(' ',nome)-1) 
ELSE nome END ) , ' '
)

update @table 
set nome =  replace (nome, '  ','')

SELECT LEN(nome) FROM @table


Alexandre Fadul

unread,
Feb 11, 2014, 9:04:13 AM2/11/14
to sqlse...@googlegroups.com
Galera, obrigado a todos pela ajuda!

Consegui fazer a função que retorna o que eu quero! Essa função pode ajudar a todos na contagem de cada palavra em uma string. Desta forma é possível saber quem estiver com nome abreviado ou com uma determinada quantidade de caracteres.

Segue o script da função:
CREATE FUNCTION [dbo].[ContaPalavras] ( @String VARCHAR(max) ) 
RETURNS varchar(max)
AS
BEGIN

DECLARE @Tabela           TABLE (ID INT, PALAVRA CHAR(1))
DECLARE @Index             INT
DECLARE @Char              CHAR(1)
DECLARE @CharAnterior      CHAR(1)
DECLARE @ContaPalavra      INT

SET @Index = 1
SET @ContaPalavra = 0

WHILE @Index <= LEN(@String)
BEGIN
    SET @Char     = SUBSTRING(@String, @Index, 1)
    SET @CharAnterior = CASE WHEN @Index = 1 THEN ' '
                         ELSE SUBSTRING(@String, @Index - 1, 1)
                    END

    IF @CharAnterior = ' ' AND @Char != ' '
        SET @ContaPalavra = @ContaPalavra + 1

INSERT INTO @Tabela
Select @ContaPalavra,@Char

    SET @Index = @Index + 1
END

DECLARE @Resultado TABLE (Qtde VARCHAR(10))

INSERT INTO @Resultado
SELECT Count(*) FROM @Tabela WHERE PALAVRA<>' ' GROUP BY ID

DECLARE @Result VARCHAR(MAX)
SET @Result = ''

SELECT @Result = @Result+';'+Qtde
FROM @Resultado

RETURN @Result

END
GO

Imagem inline 1

Att,

Gustavo Maia

unread,
Feb 13, 2014, 6:10:07 AM2/13/14
to sqlse...@googlegroups.com
Bom Dia,
 
Honestamente não sou adepto de UDFs para esse caso. Não costumam ser implementam performáticas, pois, elas serão rodadas registro a registro e isso pode ser lento para grandes quantidades de registros além de consumir mais CPU para entregar um mesmo resultado (detalhes em: http://gustavomaiaaguiar.wordpress.com/tag/scalar-functions-sql-server-desempenho-resusabilidade/). Se for realmente optar por uma função, aconselho a investir no CLR, pois, a tarefa a qual ela se propõe está muito mais relacionada a processamento do que propriamente recuperação e gravação de dados.
 
Se não quiser ir para o CLR, posto aqui uma abordagem alternativa em T-SQL. Não sei avaliar se o desempenho será superior a uma função T-SQL, mas deixo essa para os curiosos de plantão.
 
CREATE TABLE #TMP (PALAVRAS VARCHAR(1000))
 
INSERT INTO #TMP (PALAVRAS) VALUES ('Maria Jose Neto do Rosário Figueredo')
INSERT INTO #TMP (PALAVRAS) VALUES ('Uma imagem vale mais que mil palavras')
INSERT INTO #TMP (PALAVRAS) VALUES ('A diferença entre o feio e o belo pode estar nos olhos de quem vê')
INSERT INTO #TMP (PALAVRAS) VALUES ('Ontem se deu o primeiro processo de cassação em voto aberto')
INSERT INTO #TMP (PALAVRAS) VALUES ('Em terra de cego quem tem um olho é rei')
 
;WITH QRY (Palavras, TxtXML) As (
 SELECT PALAVRAS,
 CAST('<E><e>' + REPLACE(PALAVRAS,' ','</e><e>') + '</e></E>' As XML)
 FROM #TMP),
 
Res (Palavras, QtdPalavras, TotalLetras) As (
 SELECT
  Palavras, TxtXML.value('count(/E/e)','int'),
  REPLACE(
   REPLACE(
   CAST(TxtXML.query('for $e in /E/e
       return
       <e>"{string-length($e)}"</e>') As VARCHAR(MAX)),'<e>"',';'),
   '"</e>','')
 FROM QRY)
 
SELECT
 Palavras, QtdPalavras, TotalLetras
FROM Res
DROP TABLE #TMP
 
[ ]s,
 
Gustavo
Reply all
Reply to author
Forward
0 new messages