none
Problema ao retornar valores nulos RRS feed

  • Pergunta

  • Boa tarde pessoal, gostaria de tirar uma dúvida com vocês.

    Estou realizando uma consulta por select 

    SELECT  os.*
              
              FROM webuju.sami_view_os os
             WHERE os.os_tipo       = :pOs_tipo      
               AND os.un_codigo = :pUn_codigo 
               AND TO_CHAR(os.os_dtfechamento) >= COALESCE(TO_DATE(:pDtinicio , 'dd/mm/yyyy'), os.os_dtfechamento    )
               AND TO_CHAR(os.os_dtfechamento)  <= COALESCE(TO_DATE(:pDtfechamento , 'dd/mm/yyyy'), os.os_dtfechamento)  
               AND os.os_status     = 'ENCERRADO'
               AND os.fam_codigo    = COALESCE(TO_NUMBER(:Fam_codigo), os.fam_codigo)
               AND os.uf_codigo     = COALESCE(TO_NUMBER(:pUf_codigo), os.uf_codigo  )    
               AND os.ufs_codigo    = COALESCE(TO_NUMBER(:pUfs_codigo), os.ufs_codigo)
               AND os.tp_manutencao = COALESCE(TO_NUMBER(:pTp_manutencao), os.tp_manutencao)   

    E estou com o seguinte problema, na coluna os.fam_codigo estou utilizando COALESCE, mas o select não trás todas as informações, deixando de lado os valores nulos. Vocês saberiam me dizer como faço para utilizar o coalesce desta forma que esta estruturado o SELECT de um jeito que ele traga também os valores nulos. 

    quarta-feira, 20 de junho de 2012 17:06

Respostas

  • Sim Heloisa, desculpe-me por não ter postado aqui, mas fiz o seguinte para resolver o problema:

    AND NVL(os.fam_codigo, 0)    = COALESCE(TO_NUMBER(:pFam_codigo   ), NVL(os.fam_codigo, 0))

    Utilizei a função NVL, e agora consigo trazer as informações do jeito que eu precisa.

    Obrigado pela atenção de todos.

    • Marcado como Resposta Heloisa Pires quinta-feira, 28 de junho de 2012 14:24
    quinta-feira, 28 de junho de 2012 14:09

Todas as Respostas

  • Boa tarde Anderrssoon,

    Veja se o script abaixo te ajuda.

    O COALESCE serve para tratar um campo para que quando este for nulo busque de outro campo( normalmente utilizado justamente para não retornar um valor null ), veja se o script abaixo te ajuda.

    SELECT  os.*
              
              FROM webuju.sami_view_os os
             WHERE os.os_tipo       = :pOs_tipo      
               AND os.un_codigo = :pUn_codigo 
               AND ((TO_CHAR(os.os_dtfechamento) >= COALESCE(TO_DATE(:pDtinicio , 'dd/mm/yyyy'), os.os_dtfechamento    )
               AND TO_CHAR(os.os_dtfechamento)  <= COALESCE(TO_DATE(:pDtfechamento , 'dd/mm/yyyy'), os.os_dtfechamento))
                   OR os.os_dtfechamento is null)  
               AND os.os_status     = 'ENCERRADO'
               AND os.fam_codigo    = COALESCE(TO_NUMBER(:Fam_codigo), os.fam_codigo)
               AND os.uf_codigo     = COALESCE(TO_NUMBER(:pUf_codigo), os.uf_codigo  )    
               AND os.ufs_codigo    = COALESCE(TO_NUMBER(:pUfs_codigo), os.ufs_codigo)
               AND os.tp_manutencao = COALESCE(TO_NUMBER(:pTp_manutencao), os.tp_manutencao)  


    Adriano Nascimento

    quarta-feira, 20 de junho de 2012 18:08
  • Olá Adriano, muito obrigado por sua resposta, mas esta acontecendo o seguinte:

    Quanto utilizo o seguinte SQL

    SELECT SS.EQ_CODIGO, 
           EQP.EQ_TAG, 
           EQP.EQ_TAGISO, 
           INITCAP(EQP.EQ_DESCRICAO) EQ_DESCRICAO ,
           EQP.FAM_CODIGO, 
           INITCAP(F.FAM_DESCRICAO) FAM_DESCRICAO,
           OS.CAU_CODIGO,
           INITCAP(C.CAU_DESCRICAO) CAU_DESCRICAO,
           OS.DEF_CODIGO,
           INITCAP(D.DEF_DESCRICAO) DEF_DESCRICAO,
           OS.ACAO_CODIGO,
           INITCAP(A.ACAO_DESCRICAO) ACAO_DESCRICAO,
           COUNT(DISTINCT OS.OS_CODIGO) QTDE,
           COUNT(DISTINCT OSRH_CODFUNC) FUNC,
              
            TRIM(TO_CHAR(TRUNC(
            SUM(TO_NUMBER((OSRH_DTFINAL - OSRH_DTINICIO ) * 86400))
            /60/60),'909')) || ':' ||
            TRIM(TO_CHAR(TRUNC(MOD(
            SUM(TO_NUMBER((OSRH_DTFINAL - OSRH_DTINICIO ) * 86400))
            ,3600)/60),'09')) || ':' ||
            TRIM(TO_CHAR(MOD(MOD(
            SUM(TO_NUMBER((OSRH_DTFINAL - OSRH_DTINICIO ) * 86400))
            ,3600),60),'09')) TEMPO,                        
            INITCAP(OS_STATUS) OS_STATUS,
            OS.OS_DATA,
            OS.OS_DTFECHAMENTO
    
                     
            
      FROM WEBUJU.SAMI_OS           OS,
           WEBUJU.SAMI_SS           SS,
           WEBUJU.SAMI_EQUIPAMENTO EQP,
           WEBUJU.SAMI_FAMILIA       F,
           WEBUJU.SAMI_CAUSA         C,
           WEBUJU.SAMI_DEFEITO       D,
           WEBUJU.SAMI_ACAO          A,
           WEBUJU.SAMI_OS_RH        RH       
           
     WHERE RH.OS_CODIGO   = OS.OS_CODIGO
       AND A.ACAO_CODIGO  = OS.ACAO_CODIGO
       AND D.DEF_CODIGO   = OS.DEF_CODIGO
       AND C.CAU_CODIGO   = OS.CAU_CODIGO  
       AND F.FAM_CODIGO   = EQP.FAM_CODIGO
       AND EQP.EQ_CODIGO  = SS.EQ_CODIGO 
       AND SS.SS_CODIGO   = OS.SS_CODIGO
       AND OS.CAU_CODIGO  = COALESCE(TO_NUMBER(TO_CHAR(:PCAU_CODIGO)),  OS.CAU_CODIGO)         
       AND OS.DEF_CODIGO  = COALESCE(TO_NUMBER(TO_CHAR(:PDEF_CODIGO)),  OS.DEF_CODIGO)
       AND OS.ACAO_CODIGO = COALESCE(TO_NUMBER(TO_CHAR(:PACAO_CODIGO)), OS.ACAO_CODIGO)    
       AND EQP.FAM_CODIGO = COALESCE(TO_NUMBER(TO_CHAR(:PFAM_CODIGO)),  EQP.FAM_CODIGO)
       AND EQP.EQ_CODIGO  = COALESCE(TO_NUMBER(TO_CHAR(:PEQ_CODIGO)),  EQP.EQ_CODIGO)
       
       AND TO_CHAR(OS.OS_DATA) >= COALESCE(TO_DATE(:PDATAINICIAL, 'dd/mm/yyyy'), OS.OS_DATA)
       --AND TO_CHAR(OS.OS_DTFECHAMENTO) <= TO_DATE(:PDATAFINAL, 'dd/mm/yyyy') OR OS.OS_DTFECHAMENTO IS NULL
                 
                
       AND OS.OS_TIPO        = 2   
       AND OS.OS_STATUS      = COALESCE(TO_CHAR(:PSTATUS), OS.OS_STATUS)   
       AND SS.UN_CODIGO   = COALESCE(TO_NUMBER(TO_CHAR(:PUN_CODIGO)), SS.UN_CODIGO)
    
       
    GROUP BY SS.EQ_CODIGO, 
           EQP.EQ_TAG, 
           EQP.EQ_TAGISO, 
           EQP.EQ_DESCRICAO, 
           EQP.FAM_CODIGO, 
           F.FAM_DESCRICAO,
           OS.CAU_CODIGO,
           C.CAU_DESCRICAO,
           OS.DEF_CODIGO,
           D.DEF_DESCRICAO,
           OS.ACAO_CODIGO,
           A.ACAO_DESCRICAO,
           OS.OS_DATA,
           OS_STATUS,
           OS.OS_DTFECHAMENTO
           
    ORDER BY FAM_CODIGO, EQ_TAG, CAU_CODIGO, DEF_CODIGO, ACAO_CODIGO

    Ele trás as informações da tabela a baixo.

    Se eu removo o comentário da linha

    AND TO_CHAR(OS.OS_DTFECHAMENTO) <= TO_DATE(:PDATAFINAL, 'dd/mm/yyyy') OR OS.OS_DTFECHAMENTO IS NULL

    A consulta não trás informação nenhuma. 

    Se eu removo a informação que você me indicou 

    AND TO_CHAR(OS.OS_DTFECHAMENTO) <= TO_DATE(:PDATAFINAL, 'dd/mm/yyyy') 

    Ele trás apenas o campo que possui uma data de fechamento e não trás as informações com campo de data de fechamento que são nulas.

    quinta-feira, 21 de junho de 2012 11:33
  • Tenta isso:

    ...

    AND os.fam_codigo    = (COALESCE(TO_NUMBER(:Fam_codigo), os.fam_codigo) or (fam_codigo is null))

    quinta-feira, 21 de junho de 2012 11:56
  • Olá Anderrssoon,

    Você teve algum progresso nessa questão?


    Heloisa Pires | LATAM Forum Support Engineer | Microsoft Corporation

    quinta-feira, 28 de junho de 2012 13:45
  • Sim Heloisa, desculpe-me por não ter postado aqui, mas fiz o seguinte para resolver o problema:

    AND NVL(os.fam_codigo, 0)    = COALESCE(TO_NUMBER(:pFam_codigo   ), NVL(os.fam_codigo, 0))

    Utilizei a função NVL, e agora consigo trazer as informações do jeito que eu precisa.

    Obrigado pela atenção de todos.

    • Marcado como Resposta Heloisa Pires quinta-feira, 28 de junho de 2012 14:24
    quinta-feira, 28 de junho de 2012 14:09