none
substring sql server RRS feed

  • Pergunta

  • Bom dia a todos!

    Tenho uma consulta no sql server que traz alguns dados da seguinte forma:

    1º ex: Banco de dados » Alterar parâmetros de configuraçao de banco de dados;

    2º ex: E-mail » Conta » Erro ou falha.

    preciso que sejam separados pelo caracter » em duas colunas, uma que traga o que tiver antes desse caracter, e outra coluna que traga o que tiver depois desse caracter.

    no pimeiro exemplo, consegui de boa, está separando normalmente, mas no segundo exemplo, tenho que considerar a segunda ocorrencia do caracter », e é isso que está meio tenso.

    Já tentei usar substring, reverse, charindex, e chego a resultados próximos, mas não o exato.

    Não posso usar função porque o resultado da consulta vai continuar sendo uma lista e essa separação tem que ocorrer dinamicamente, para usar em uma crosstab depois.

    O ideal seria uma forma da função substring contar da direita para a esquerda sem usar o reverse, mas não funciona colocar parâmetros negativos.

    Desde já agradeço as respostas. Obrigado.

    terça-feira, 26 de fevereiro de 2013 15:47

Todas as Respostas

  • Ve se te ajuda Edmundo:

    DECLARE @Teste VARCHAR(100)
    
    SET @Teste = 'E-mail » Conta » Erro ou falha.'
    
    SELECT SUBSTRING(@Teste, 1, CHARINDEX('»', @Teste, 1)-1),
    		SUBSTRING(@Teste, CHARINDEX('»', @Teste, 1)+1, (CHARINDEX('»', @Teste, CHARINDEX('»', @Teste, 1)+1)-1) - CHARINDEX('»', @Teste, 1)),
    		SUBSTRING(@Teste, CHARINDEX('»', @Teste, CHARINDEX('»', @Teste, 1)+1)+1, LEN(@Teste))
    		
    ------------------------------------------
    -- OUTRA OPCAO COM VARIAVEIS
    ------------------------------------------
    DECLARE @Teste2 VARCHAR(100),
    		@Ocorrencia1 INT,
    		@Ocorrencia2 INT
    
    SET @Teste2 = 'E-mail » Conta » Erro ou falha.'
    SET @Ocorrencia1 = CHARINDEX('»', @Teste2, 1)
    SET @Ocorrencia2 = CHARINDEX('»', @Teste2, (@Ocorrencia1+1))
    
    SELECT SUBSTRING(@Teste2, 1, (@Ocorrencia1-1)),
    		SUBSTRING(@Teste2, (@Ocorrencia1+1), (@Ocorrencia2 - 1 - @Ocorrencia1)),
    		SUBSTRING(@Teste2, (@Ocorrencia2+1), LEN(@Teste2))


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 26 de fevereiro de 2013 17:05
  • Edmundo,

    Segue um outro exemplo:

    DECLARE

    @t1 TABLE

    (

    Campo

    VARCHAR(100)

    )

    INSERT

    INTO @t1(Campo)

    VALUES

    (

    'E-mail Conta Erro ou falha'),('Banco de dados Alterar parmetros de configuraao de banco de dados')

    SELECT

    REPLACE(REVERSE(SUBSTRING(REVERSE(Campo), CHARINDEX('', REVERSE(Campo)), 8000)), '', ' ') As Valor1

    , RTRIM(LTRIM(RIGHT(Campo, CHARINDEX('', REVERSE(Campo))-1))) As Valor2

    FROM

    @t1


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    terça-feira, 26 de fevereiro de 2013 17:12
    Moderador