none
Trazer Colunas que não contenham valores NULOS RRS feed

  • Pergunta

  • Boa tarde a todos,

    estou fazendo um updante de muitas colunas de uma mesma tabela para o banco de outra empresa q contenha esta mesma tabela com os mesmos dados, porém esta tabela está me trazendo muitos valores nulos, teria como vcs me disponibilizar algum tipo de consulta que eliminasse todas as colunas com valores nulos de uma só vez, sem precisar de aplicar is not null em coluna por coluna?


    CharlesTI.

    quarta-feira, 21 de outubro de 2015 17:12

Respostas

  • Charles, fiz um exemplo aqui, para os 2 casos... Veja se algum deles te atende:

    create table ValidaNulls (a int, b int, c int, d int)
    GO
    insert into ValidaNulls 
    values 
    (1, 2, 3, 4),
    (null, 2, 3, 4),
    (1, null, 3, 4),
    (1, 2, null, 4),
    (1, 2, 3, null),
    (null, null, 3, 4),
    (null, 2, null, 4),
    (null, 2, 3, null),
    (1, null, null, 4),
    (1, null, 3, null),
    (1, 2, null, null),
    (null, null, null, 4),
    (null, null, 3, null),
    (null, 2, null, null),
    (1, null, null, null),
    (null, null, null, null)
    
    select *
    from ValidaNulls
    where coalesce (a,b,c,d) is not null
    
    /*
    a           b           c           d
    ----------- ----------- ----------- -----------
    1           2           3           4
    NULL        2           3           4
    1           NULL        3           4
    1           2           NULL        4
    1           2           3           NULL
    NULL        NULL        3           4
    NULL        2           NULL        4
    NULL        2           3           NULL
    1           NULL        NULL        4
    1           NULL        3           NULL
    1           2           NULL        NULL
    NULL        NULL        NULL        4
    NULL        NULL        3           NULL
    NULL        2           NULL        NULL
    1           NULL        NULL        NULL
    */
    
    select *
    from ValidaNulls
    where coalesce (a,b,c,d) is null
    /*
    a           b           c           d
    ----------- ----------- ----------- -----------
    NULL        NULL        NULL        NULL
    */

    []'s!


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

    A questão Charles é:
    Vc quer ignorar COMPLETAMENTE a coluna ????

    Esse exemplo do Logan está ótimo !!! Mas ele é 8 ou 80, ou ele vai retornar a coluna se tiver um registro ou nada !!!


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Marcado como Resposta CHARLES.PTU quinta-feira, 22 de outubro de 2015 11:04
    quarta-feira, 21 de outubro de 2015 18:13
  • Charles,

    Nos campos que são data, você deve fazer um convert para varchar no formato desejado:

    CONVERT(VARCHAR(12),Coluna,Estilo) 

    Para ver os formatos de datas, veja esse link: https://msdn.microsoft.com/pt-br/library/ms187928(v=sql.120).aspx

    O mesmo é válido para os campos numéricos... Se houver uma coluna int, você deve convertê-la para varchar (convert(varchar(10),a)) também, pois o coalesce fará a conversão implícita para int de todos os campos e então você terá um erro de conversão de varchar para int.  Moral da história: Todos os campos devem ter o mesmo tipo de dado, senão você possivelmente terá erro de conversão.

    O que eu fiquei me perguntando é: na tua frase "Pq são muitas colunas de uma mesma tabela, e das mesmas preciso somente de poucas informações para montar um arquivo" você sabe quais colunas você deve retornar para esse seu arquivo? Ou você precisa retornar todas as colunas desse select?

    []'s!


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

    • Marcado como Resposta CHARLES.PTU quinta-feira, 22 de outubro de 2015 11:04
    quarta-feira, 21 de outubro de 2015 19:13

Todas as Respostas

  • Charles, não ficou claro para mim:

    Você quer uma consulta que retorne registros que não tenha nenhuma coluna com valor null (COL1 is not null AND col2 is not null...) ou que retorne registros que tenham pelo menos uma coluna com valor null (COL1 is not null OR COL2 is not null...)?

    []'s!


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

    quarta-feira, 21 de outubro de 2015 17:50
  • Charles, fiz um exemplo aqui, para os 2 casos... Veja se algum deles te atende:

    create table ValidaNulls (a int, b int, c int, d int)
    GO
    insert into ValidaNulls 
    values 
    (1, 2, 3, 4),
    (null, 2, 3, 4),
    (1, null, 3, 4),
    (1, 2, null, 4),
    (1, 2, 3, null),
    (null, null, 3, 4),
    (null, 2, null, 4),
    (null, 2, 3, null),
    (1, null, null, 4),
    (1, null, 3, null),
    (1, 2, null, null),
    (null, null, null, 4),
    (null, null, 3, null),
    (null, 2, null, null),
    (1, null, null, null),
    (null, null, null, null)
    
    select *
    from ValidaNulls
    where coalesce (a,b,c,d) is not null
    
    /*
    a           b           c           d
    ----------- ----------- ----------- -----------
    1           2           3           4
    NULL        2           3           4
    1           NULL        3           4
    1           2           NULL        4
    1           2           3           NULL
    NULL        NULL        3           4
    NULL        2           NULL        4
    NULL        2           3           NULL
    1           NULL        NULL        4
    1           NULL        3           NULL
    1           2           NULL        NULL
    NULL        NULL        NULL        4
    NULL        NULL        3           NULL
    NULL        2           NULL        NULL
    1           NULL        NULL        NULL
    */
    
    select *
    from ValidaNulls
    where coalesce (a,b,c,d) is null
    /*
    a           b           c           d
    ----------- ----------- ----------- -----------
    NULL        NULL        NULL        NULL
    */

    []'s!


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

    quarta-feira, 21 de outubro de 2015 18:00
  • Charles, fiz um exemplo aqui, para os 2 casos... Veja se algum deles te atende:

    create table ValidaNulls (a int, b int, c int, d int)
    GO
    insert into ValidaNulls 
    values 
    (1, 2, 3, 4),
    (null, 2, 3, 4),
    (1, null, 3, 4),
    (1, 2, null, 4),
    (1, 2, 3, null),
    (null, null, 3, 4),
    (null, 2, null, 4),
    (null, 2, 3, null),
    (1, null, null, 4),
    (1, null, 3, null),
    (1, 2, null, null),
    (null, null, null, 4),
    (null, null, 3, null),
    (null, 2, null, null),
    (1, null, null, null),
    (null, null, null, null)
    
    select *
    from ValidaNulls
    where coalesce (a,b,c,d) is not null
    
    /*
    a           b           c           d
    ----------- ----------- ----------- -----------
    1           2           3           4
    NULL        2           3           4
    1           NULL        3           4
    1           2           NULL        4
    1           2           3           NULL
    NULL        NULL        3           4
    NULL        2           NULL        4
    NULL        2           3           NULL
    1           NULL        NULL        4
    1           NULL        3           NULL
    1           2           NULL        NULL
    NULL        NULL        NULL        4
    NULL        NULL        3           NULL
    NULL        2           NULL        NULL
    1           NULL        NULL        NULL
    */
    
    select *
    from ValidaNulls
    where coalesce (a,b,c,d) is null
    /*
    a           b           c           d
    ----------- ----------- ----------- -----------
    NULL        NULL        NULL        NULL
    */

    []'s!


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

    A questão Charles é:
    Vc quer ignorar COMPLETAMENTE a coluna ????

    Esse exemplo do Logan está ótimo !!! Mas ele é 8 ou 80, ou ele vai retornar a coluna se tiver um registro ou nada !!!


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Marcado como Resposta CHARLES.PTU quinta-feira, 22 de outubro de 2015 11:04
    quarta-feira, 21 de outubro de 2015 18:13
  • Boa tarde Logan,

    quero somente que não apareça colunas com valores "NULL". Pq são muitas colunas de uma mesma tabela, e das mesmas preciso somente de poucas informações para montar um arquivo de UPDATES.


    CharlesTI.


    • Editado CHARLES.PTU quarta-feira, 21 de outubro de 2015 18:16
    quarta-feira, 21 de outubro de 2015 18:15
  • Testei aqui o comando "Coalesce" Logan e não deu certo, apareceu pra mim a seguinte mensagem de erro:

    Msg 242, Level 16, State 3, Line 1
    The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.


    CharlesTI.

    quarta-feira, 21 de outubro de 2015 18:28
  • SELECT * FROM TTMV WHERE CODCOLIGADA=1 and

    coalesce(CODIGOMOVFIXO, TIPOEMITENTE, CODCFOEMISSAO, NOMELOCALSAIDA, EDICAOLOCALSAIDA,

    TIPODESTIN, EDICAODESTIN, CODCFODESTIN, TIPOIDENTIFIC, MASCARANUMEROMOV, EDICAONUMEROMOV,

    BUSCARNUMEROMOV, EDICAOSERIE, SEGNUMSEQUENCIAL, LABELNUMPEDIDO, EDICAONUMPEDIDO, NUMEROPEDIDO,

    LABELNUMPEDCF, EDICAONUMPEDCF, NUMEROPEDCF, EDICAONATUREZA, TIPONATUREZANOTA, EDICAONATUREZA2,

    CODMODELODOCFISC, TIPOICMS, TIPOIPI, NOMEDATASAIDA, EDICAOSAIDA, DATASAIDA, NOMEDATADIGIT,

    EDICAODIGIT, DATADIGIT, NOMEDATA, EDICAODATA, DATADATA, EDICAOREPR, CODRPR, EDICAOCOMISREPR,

    PERCCOMISREPR, EDICAOTRANSP, EDICAOTRANSP2, CODTRA, CODTRA2, EDICAOVIATRANSP, VIATRANSPORTE,

    EDITADADOSPLACA, EDICAOOBSERVACAO, OBSERVACAO, USAMENSAGEMMOV1, CODMENMOV1, USAMENSAGEMMOV2,

    CODMENMOV2, EDICAOHISTORMOV, EDICAOMARCAVOL, MARCAVOL, EDICAOQTDEVOL, QTDEMOVEASOMA,

    EDICAOESPECIEVOL, ESPECIEVOL, EDICAOPESOLIQ, EDICAOPESOBRU, PESOLIQMOVEASOMA, PESOBRUMOVEASOMA,

    CONFITEMPESOZERO, EDICAOCONDPGTO, ALTERACONDPGTO,

    CODCPG, EDICAOTB1FATMOV, CODTB1FATMOV,

    EDICAOTB2FATMOV, CODTB2FATMOV, EDICAOTB3FATMOV,

    CODTB3FATMOV, EDICAOTB4FATMOV, CODTB4FATMOV,

    EDICAOTB5FATMOV, CODTB5FATMOV, EDICAOTB1FLXMOV,

    CODTB1FLXMOV, EDICAOTB2FLXMOV, CODTB2FLXMOV,

    EDICAOTB3FLXMOV, CODTB3FLXMOV, EDICAOTB4FLXMOV,

    CODTB4FLXMOV, EDICAOTB5FLXMOV, CODTB5FLXMOV,

    USACAMPOLIVMOV1, NOMECAMPOLIVMOV1, CAMPOLIVMOV1,

    USACAMPOLIVMOV2, NOMECAMPOLIVMOV2, CAMPOLIVMOV2,

    USACAMPOLIVMOV3, NOMECAMPOLIVMOV3, CAMPOLIVMOV3,

    EDICAOFRETE, TIPOFRETE, INFORMACIFFOB, CODMENFRETECIF,

    CODMENFRETEFOB, EDICAOSEGURO, TIPOSEGURO,

    EDICAODESCMOV, TIPODESCMOV, DESCMAXIMOMOV,

    CODMENDESCMOV, EDICAODESPMOV, TIPODESPMOV,

    CODMENDESPMOV, USADESPFINANC, NOMEEXTRA1,

    EDICAOEXTRA1, TIPOEXTRA1, NOMEEXTRA2, EDICAOEXTRA2,

    TIPOEXTRA2, EDICAOADIANTPED, DATABASEMOV, CODMOEDA,

    NOMESUBTOTAL, EDITAVALFINLIVRE, USATRBMOV, EDITATRBMOV,

    EDITABCTRBMOV, NUMTRBSELECMOV, TIPOLANCAMENTO,

    FATURA, FATURAMANUTENCAO, EDICAOLAN, TIPODOCGERADO,

    IDRELATFAT, IDRELATDUP, IDRELATMOV, IMPINSTFAT,

    IMPINSTDUP, IMPINSTDOC, DATAEMISSAOLAN,

    DATAPREVISAOLAN, DATA1LAN, DATA2LAN, DATA3LAN,

    NUMERACAOLAN, CONTABILLAN, HISTORICOLAN,

    CODMOEDALAN, CODINDEXADORLAN, BUSCARCAIXALAN,

    BAIXARLAN, PERCENTDESCLAN, PERCENTJUROSLAN,

    STATUSCNABLAN, COMANDOCNABLAN, ACEITECNABLAN,

    INSTCOD1CNABLAN, INSTCOD2CNABLAN, CARTEIRACNABLAN,

    ASSOCIASEGNUMLAN, DATABASEVENCLAN, CAPITALMENSALLAN,

    PAGOURECLAN, NUMEROPRECOVEND, FLAGDATAMOV,

    GERAMOVPED, GERAMOVAUTOPED, CODTMVPED,

    BAIXAGERACAOPED, CONFIRMABAIXAPED, CANCELALCTPED,

    CONTROLASENHAPED, PRECOCOMDESCPED, PRECOMOVGERPED,

    CANCELACOMMOVPED, NUMEROVERSAOTMOV, ALTERATIPOLAN,

    CODTRBRATEIOLAN, USAVORCCCUSTO, USAVORCFISCCTTIP,

    AVIVORCCCUSTO, AVIVORCFISCCTTIP, AVICREDITOCLIFOR,

    EDITATROCO, CODVEN1, CODVEN2, CODVEN3, CODVEN4,

    EDICAOVEN1, EDICAOCOMISVEN1, PERCCOMISVEN1,

    EDICAOVEN2, EDICAOCOMISVEN2, PERCCOMISVEN2,

    EDICAOVEN3, EDICAOCOMISVEN3, PERCCOMISVEN3,

    EDICAOVEN4, EDICAOCOMISVEN4, PERCCOMISVEN4,

    CODCOLCFOEMISSAO, CODCOLCFODESTIN, APLICACAOFRM,

    AFETACUSTOREP, AFETACUSTOREPB, CODCOLCXA,

    EDITACCUSTO, TIPOTRANSFFAT, CODCCUSTO,

    CODFRMLIQUIDO, CODFRMSUBTOTAL, CODFRMBRUTO,

    CODFRMCUSTOREP, CODFRMCUSTOREPB,

    CODFRMPRECOVEND, CODFRMRATEIOLAN, CODCXALAN,

    CODCOLIGADA, CODTDOLANNF, CODTDOLANDUP,

    RENUMERARIMPRESSAO, USAREVC, CODEVENTO,

    EDITAEVENTOCONT, CADASTRACHEQLAN, EDICAOENTREGA,

    DATAENTREGA, INTEGRADOFACTOR, EDICAODEPARTAMENTO,

    MARCARITENSFATPED, NAOAGRUPARITENSPED,

    EDICAOLOCALESTOQUE, CODFILIAL, CODLOC, TIPOHISTORICO,

    TIPOMOVTRANSF, NUMEROMAXPARCELAS, VALORMINPARCELA,

    USARDEVOLUCAO, TIPODEVOLUCAO, RELACITENSFATURAMENTO,

    DATAORCAMENTO, TABBASEORCAMENTO,

    ACEITANUMSERIE, USANUMSERIESEQ, CODDEPTODEFAULTMOV,

    CODDEPTODEFAULTITEM, CODCOLRELDUP, CODCOLRELFAT,

    CODCOLRELMOV, IDNAT, IDNAT2, CLASSIFICACAO,

    CODMENFRETETERCEIRO, RECCREATEDBY, RECCREATEDON,

    RECMODIFIEDBY, RECMODIFIEDON,

    IDFORMAPAGTOBAIXARLAN) is not null



    CharlesTI.


    • Editado CHARLES.PTU quarta-feira, 21 de outubro de 2015 18:31
    quarta-feira, 21 de outubro de 2015 18:28
  • Charles,

    Nos campos que são data, você deve fazer um convert para varchar no formato desejado:

    CONVERT(VARCHAR(12),Coluna,Estilo) 

    Para ver os formatos de datas, veja esse link: https://msdn.microsoft.com/pt-br/library/ms187928(v=sql.120).aspx

    O mesmo é válido para os campos numéricos... Se houver uma coluna int, você deve convertê-la para varchar (convert(varchar(10),a)) também, pois o coalesce fará a conversão implícita para int de todos os campos e então você terá um erro de conversão de varchar para int.  Moral da história: Todos os campos devem ter o mesmo tipo de dado, senão você possivelmente terá erro de conversão.

    O que eu fiquei me perguntando é: na tua frase "Pq são muitas colunas de uma mesma tabela, e das mesmas preciso somente de poucas informações para montar um arquivo" você sabe quais colunas você deve retornar para esse seu arquivo? Ou você precisa retornar todas as colunas desse select?

    []'s!


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

    • Marcado como Resposta CHARLES.PTU quinta-feira, 22 de outubro de 2015 11:04
    quarta-feira, 21 de outubro de 2015 19:13
  • Era algumas colunas Logan,

    mas vc me ajudou muito, obrigado mesmo pela ajuda!


    CharlesTI.

    quinta-feira, 22 de outubro de 2015 11:05
  • Charles, fiz um exemplo aqui, para os 2 casos... Veja se algum deles te atende:

    create table ValidaNulls (a int, b int, c int, d int)
    GO
    insert into ValidaNulls 
    values 
    (1, 2, 3, 4),
    (null, 2, 3, 4),
    (1, null, 3, 4),
    (1, 2, null, 4),
    (1, 2, 3, null),
    (null, null, 3, 4),
    (null, 2, null, 4),
    (null, 2, 3, null),
    (1, null, null, 4),
    (1, null, 3, null),
    (1, 2, null, null),
    (null, null, null, 4),
    (null, null, 3, null),
    (null, 2, null, null),
    (1, null, null, null),
    (null, null, null, null)
    
    select *
    from ValidaNulls
    where coalesce (a,b,c,d) is not null
    
    /*
    a           b           c           d
    ----------- ----------- ----------- -----------
    1           2           3           4
    NULL        2           3           4
    1           NULL        3           4
    1           2           NULL        4
    1           2           3           NULL
    NULL        NULL        3           4
    NULL        2           NULL        4
    NULL        2           3           NULL
    1           NULL        NULL        4
    1           NULL        3           NULL
    1           2           NULL        NULL
    NULL        NULL        NULL        4
    NULL        NULL        3           NULL
    NULL        2           NULL        NULL
    1           NULL        NULL        NULL
    */
    
    select *
    from ValidaNulls
    where coalesce (a,b,c,d) is null
    /*
    a           b           c           d
    ----------- ----------- ----------- -----------
    NULL        NULL        NULL        NULL
    */

    []'s!


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

    Logan,

    Um detalhe, se você rodar o seu código sem utilizar a claúsula Where em conjunto com a função Coalesce o SQL Server deverá retornar 15 linhas, sem o Where serão retornadas 16 linhas! Talvez o Coalesce não esteja atendendo exatamente o que o Charles esta pensando.


    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:20
  • Então Junior,

    Sem o " WHERE COALESCE..." são retornadas 16 linhas pois foram todas as linhas inseridas, sendo a última, todos os campos nulos (não sei quando - nem porquê - isso existiria, mas enfim).

    Quando eu coloco o COALESCE, retornam 15 linhas pois são as linhas que possuem ao menos uma coluna que não é nula (a minha pergunta principal para ele). Seria o mesmo que fazer "coluna1 is not null OR coluna 2 is not null OR coluna3 is not null OR.... O que ele estava evitando fazer).

    Agora, se a ideia dele era retornar apenas os registros que não tivessem nenhum valor nulo (trocar o OR pelo AND), aí a coisa mudaria de figura e, realmente, o coalesce não ia resolver.

    Porém, pela resposta dele, acredito que foi o que ele pediu... Mas se não era exatamente o que ele queria, basta remover a resposta e seguimos até achar a solução para o caso dele. ;-)

    []'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 17:32