Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Frankie Hummel

Select em campo varchar

Recommended Posts

Boa tarde pessoal, preciso muito da ajuda de vcs. Aki na empresa tem um sistema antigo no banco mysql.

 

Em uma coluna da tabela existe uns dados gravados e separado por "," e eu precisava fazer um select nesse campo vou dar um exemplo abaixo:

 

no campos eu tenho

 

COLUNA_1

 

maça,laranja, coco

maça,coco

coco,maça

laranja,coco

coco

maça,laranja

 

 

E assim por diante eu queria montar um select que pegasse a quantidade de "Laranjas" e outro que pega-se a quantidade de "maça"

 

 

Como eu poderia montar essa Query?

 

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia amigo,

 

Olha, com esta query tu já pode separar e obter a primeira palavra de cada campo:

 

SELECT 
REPLACE ( SUBSTRING( 
             SUBSTRING_INDEX ( COLUNA_1, ',', 1 ), 
             LENGTH ( SUBSTRING_INDEX ( COLUNA_1, ',', 0 ) ) + 1
         ), 
         ',', 
         ''
       )
FROM TUA_TABELA

Essas funções estão retornando tudo que tem antes da primeira vírgula em cada campo.

 

Tente implementar uma lógica que use ela num looping até ler todas as palavras de todos os campos, eu vou tentar aqui também só estou repassando pra você ter um começo já.

 

Ah e uma observação: Solicitaçãozinha complicada essa tua hein rs Não pode fazer via código-fonte na aplicação? Selecionar todos os campos brutos do banco e dividi-los depois?

 

Vou continuar aqui, abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde amigo,

 

Vou te dar uma sugestão que eu desenvolvi aqui, pra você normalizar essa tabela, transformar cada campo desse separado por vírgula em uma linha só. Olha eu fiz esta PROCEDURE:

 

DROP PROCEDURE IF EXISTS NormalizaTabela;

CREATE PROCEDURE NormalizaTabela()
BEGIN
   DECLARE iPos, iNewID, iOldID integer;
   DECLARE sValue varchar(50);

   DROP TABLE IF EXISTS TABELA_NOVA;
   CREATE TABLE TABELA_NOVA( ID int(10) NOT NULL AUTO_INCREMENT, COLUNA_1 varchar(50), PRIMARY KEY (ID) );

   SET iOldID = ( SELECT MIN(ID) FROM TABELA_ANTIGA );

   Main: LOOP    
       SET iPos   = 1;
       SET sValue = "";

       IF EXISTS (SELECT ID FROM TABELA_ANTIGA WHERE ID = iOldID) THEN 
       BEGIN
           LeRegistro: LOOP 
               SET sValue = (SELECT ( REPLACE ( SUBSTRING( SUBSTRING_INDEX ( COLUNA_1, ',', iPos ), LENGTH ( SUBSTRING_INDEX ( COLUNA_1, ',', iPos - 1 ) ) + 1 ), ',', '' )) FROM TABELA_ANTIGA WHERE ID = iOldID );
               SET sValue = (TRIM(sValue));
               SET sValue = (IF(sValue = null, "", sValue));

               IF  (sValue <> "") THEN BEGIN
                   INSERT INTO TABELA_NOVA (ID, COLUNA_1) VALUES (iNewID, sValue);
                   SET iPos   = iPos   + 1;
                   SET iNewID = iNewID + 1;
               END ;
               ELSE BEGIN
                   SET iOldID = iOldID + 1;
                   LEAVE LeRegistro ;
               END ;
               END IF ;
           END LOOP LeRegistro ;
       END ;
   ELSE LEAVE Main ;
   END IF ;
   END LOOP Main ;
END;

CALL NormalizaTabela;

Esta Procedure vai pegar a Query que eu te passei hoje mais cedo e executar em looping como eu tinha dito, pra ler todas as linhas da tabela antiga e pegar cada palavra separada por vírgula e criar um registro novo em uma tabela nova.

 

Tu pode fazer isto com esse banco? Faça devidos ajustes nas tabelas se necessário (como colocar mais colunas, etc).

 

Fico a disposição pra saber se foi útil.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde DiegoAngra07

 

Gostaria muito de agradecer sua ajuda, você não imagina como me ajudou, não testei pois cheguei agora de uma reunião mas vou fazer os devidos teste...

 

 

Amigo muito obrigado mesmo tá!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde DiegoAngra07

 

Gostaria muito de agradecer sua ajuda, você não imagina como me ajudou, não testei pois cheguei agora de uma reunião mas vou fazer os devidos teste...

 

 

Amigo muito obrigado mesmo tá!!

Boa tarde Frankie,

 

Que isso cara fico satisfeito em ajudar :D

 

Caso essa Procedure não te atenda podemos fazer 1 função aplicando a mesma lógica que te retorne o número de "maca" ou "laranja" ou qualquer coisa que você passe por parâmetro.

 

Fico a disposição, abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite amigo,

 

Me adiantei e fiz a função que citei mais cedo, caso você precise dela. Segue:

 

DROP FUNCTION IF EXISTS ContaPalavra;
CREATE FUNCTION ContaPalavra ( sPalavra varchar(50) ) RETURNS int(11)
BEGIN
   DECLARE iCont, iPos, iOldID, iFim integer;
   DECLARE sValue varchar(50);

   SET iFim   = 0;    
   SET iCont  = 0;
   SET iOldID = ( SELECT min(ID) FROM TUA_TABELA );

   REPEAT    
       SET iPos    = 1; 
       SET sValue  = "";

       IF EXISTS (SELECT ID FROM TUA_TABELA WHERE ID = iOldID) THEN 
       BEGIN
           REPEAT
               SET sValue = (SELECT ( REPLACE ( SUBSTRING( SUBSTRING_INDEX ( COLUNA_1, ',', iPos ), LENGTH ( SUBSTRING_INDEX ( COLUNA_1, ',', iPos - 1 ) ) + 1 ), ',', '' )) FROM TUA_TABELA WHERE ID = iOldID );
               SET sValue = (TRIM(sValue));
               SET sValue = (IF(sValue = null, "", sValue));

               IF  ( sValue <> "" ) THEN BEGIN
                   IF ( sValue = sPalavra ) THEN SET iCont = iCont + 1; END IF;                    
                   SET iPos = iPos + 1;
               END;
               ELSE SET iOldID = iOldID + 1;                

               END IF ;
           UNTIL (sValue = "") END REPEAT;
       END;
       ELSE SET iFim = 1; 
       END IF ;
   UNTIL (iFim = 1) END REPEAT;

   RETURN iCont ;
END;

-- Exemplo de chamada
SELECT ContaPalavra("maca");

Qualquer coisa estamos aí, abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.