none
Query - Dividir em linhas de acordo com valor CHAR de uma coluna RRS feed

  • Pergunta

  • Boa tarde, tenho uma tabela

    (INT) | (CHAR)
    COL1 | COL2
    75     | NULL
    78     | C
    12     | B

    o resultado do select teria que ser
    COL1 | COL2
    75     | NULL
    78     | NULL
    78     | B
    78     | C
    12     | NULL
    12     | B

    Como alcanço essa façanha?

    ATUALIZAÇÃO

    Após comentário do gapimex atualizei a pergunta com o schema exato da tabela.

    CREATE TABLE database.dbo.components
      (com_id INT IDENTITY NOT NULL
         CONSTRAINT components_pk PRIMARY KEY (com_id),
       com_exceptions VARCHAR(1))

    Para os efeitos do exemplo, COL1 é "com_id" e COL2 é "com_exceptions".

    quarta-feira, 21 de outubro de 2015 18:22

Respostas

  • Se é do tipo Varchar experimente adicionar um Cast na parte recursiva como no exemplo abaixo:

    with CTE_Rec as
    (
        select
            COL1,
            COL2
        from Tabela
        
        union all
        
        select
            COL1,
            case when ASCII(COL2) > 66 then CAST(CHAR(ASCII(COL2) - 1) AS VARCHAR(1)) end
        from CTE_Rec as c
        where 
            COL2 is not null
    )
    
    select
        COL1,
        COL2
    from CTE_Rec
    order by
        COL1,
        COL2

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta SammuelMiranda quinta-feira, 22 de outubro de 2015 12:26
    quinta-feira, 22 de outubro de 2015 11:52

Todas as Respostas

  • Boa tarde,

    Experimente dessa forma:

    with CTE_Rec as
    (
        select
            COL1,
            COL2
        from Tabela
        
        union all
        
        select
            COL1,
            case when ASCII(COL2) > 66 then CHAR(ASCII(COL2) - 1) end
        from CTE_Rec as c
        where 
            COL2 is not null
    )
    
    select
        COL1,
        COL2
    from CTE_Rec
    order by
        COL1,
        COL2

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 21 de outubro de 2015 18:42
  • Boa tarde.

    Deu um erro:

    Msg 240, Level 16, State 1, Line 1
    Types don't match between the anchor and the recursive part in column "COL2" of recursive query "CTE_Rec".

    quarta-feira, 21 de outubro de 2015 19:00
  • Qual é o tipo de dados da coluna COL2? Não é Char?

    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 21 de outubro de 2015 19:14
  • É, mas está declarado assim:

    CREATE TABLE database.dbo.components
      (com_id INT IDENTITY NOT NULL
         CONSTRAINT components_pk PRIMARY KEY (com_id),
       com_exceptions VARCHAR(1))

    A coluna "com_id" é a COL1 no meu exemplo (não tinha usado o nome real da coluna...) e "com_exceptions" é COL2.

    O valor de "com_exceptions" deve ser "NULL", "B", "C", "D" ou "E". Se for "NULL" vai resultar em 1 linha, se for "B" 2 linhas (uma com NULL e outra com "B"), se for "C" 3 linhas e assim por diante.

    quinta-feira, 22 de outubro de 2015 11:27
  • Se é do tipo Varchar experimente adicionar um Cast na parte recursiva como no exemplo abaixo:

    with CTE_Rec as
    (
        select
            COL1,
            COL2
        from Tabela
        
        union all
        
        select
            COL1,
            case when ASCII(COL2) > 66 then CAST(CHAR(ASCII(COL2) - 1) AS VARCHAR(1)) end
        from CTE_Rec as c
        where 
            COL2 is not null
    )
    
    select
        COL1,
        COL2
    from CTE_Rec
    order by
        COL1,
        COL2

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta SammuelMiranda quinta-feira, 22 de outubro de 2015 12:26
    quinta-feira, 22 de outubro de 2015 11:52
  • Value, é isso mesmo.
    quinta-feira, 22 de outubro de 2015 12:26
  • gapimex, tua solução está perfeita na minha opinião mas, na verdade, o erro vai continuar ocorrendo.

    Para resolver, especifquei o nome das colunas na CTE, nem foi preciso o convert para varchar:

    with CTE_Rec (COL1, COL2) as
    (
    ...

    []'s!


    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */

    quinta-feira, 22 de outubro de 2015 12:43
  • Logan, fiz um teste sem a conversão mas o erro persistiu:

    declare @Tabela table
    ( COL1 INT,  COL2 VARCHAR(1));
    
    insert into @Tabela values
    (75, NULL),
    (78, 'C'),
    (12, 'B');
    
    with CTE_Rec (COL1, COL2) as
    (
        select
            COL1,
            COL2
        from @Tabela
        
        union all
        
        select
            COL1,
            case when ASCII(COL2) > 66 then CHAR(ASCII(COL2) - 1)  end
        from CTE_Rec as c
        where 
            COL2 is not null
    )
    
    select
        COL1,
        COL2
    from CTE_Rec
    order by
        COL1,
        COL2

    Abs


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 22 de outubro de 2015 13:29
  • gapimex,

    Esquece... Eu acho que durante a simulação eu mudei o tipo da coluna de varchar(1) para char(1) e aí, obviamente, o erro não ocorreu mais.

    Bobeira minha. 

    Valeu!


    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */

    quinta-feira, 22 de outubro de 2015 13:56
  • Se é do tipo Varchar experimente adicionar um Cast na parte recursiva como no exemplo abaixo:

    with CTE_Rec as
    (
        select
            COL1,
            COL2
        from Tabela
        
        union all
        
        select
            COL1,
            case when ASCII(COL2) > 66 then CAST(CHAR(ASCII(COL2) - 1) AS VARCHAR(1)) end
        from CTE_Rec as c
        where 
            COL2 is not null
    )
    
    select
        COL1,
        COL2
    from CTE_Rec
    order by
        COL1,
        COL2

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    Gapimex,

    Cara sensacional o seu código, poxa vida acredito que eu nunca chegaria a esta solução, parabéns.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 22 de outubro de 2015 17:29
  • Vlw Junior! Obrigado pelo comentário.

    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 22 de outubro de 2015 20:21