SQL - DB2 - Verificar valores NULOS


Volta a página anterior

Volta ao Menu Principal


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

SQL - DB2 - Verificar valores NULOS
Valores nulos
  • Algumas colunas podem não ter valor significativo em cada linha.
    DB2 usa um indicador de valor especial, o valor nulo para indicar um valor desconhecido ou faltando.
    Nulo é um valor especial que DB2 interpretada para indicar que nenhum dado está presente.

  • Se você não especifique o contrário, o DB2 permite que qualquer coluna que contém valores nulos.
    Os usuários podem criar linhas na tabela, sem fornecer um valor para a coluna.

  • Por utilização da cláusula NOT NULL não pode permitir coluna nulos.
    As chaves primárias devem ser definidas como NOT NULL.

Antes de decidir se deseja permitir nulo para valores desconhecidos em uma determinada coluna, você deve considerar como os nulos vão afetar os resultados de uma consulta:

      nulos em programas de aplicação
    • Em uma instrução SQL, null só cumprem a condição do predicado especial é nulo. DB2 classifica valores de forma diferente do que valores diferentes de zero.
      Valores nulos não se comportam como os outros valores. Por exemplo, se DB2 perguntar se um valor nulo é maior do que um certo valor conhecido, a resposta a ser desconhecido.
      Sim, seguida, pedir DB2 se um valor nulo é menor do que o mesmo valor conhecido, a resposta permanece desconhecido.
    • Se obtem um valor desconhecido é inaceitável para uma determinada coluna, em vez disso você pode definir um valor padrão.
      Os programadores estão familiarizados com o comportamento dos valores omissão

      nulos em uma operação da União
    • Null eles exigem especial da União operações de manipulação.
      Se executa uma operação de união em uma coluna que pode conter valores nulos, considere o uso de uma união externa.

Comparação de valores nulos e valores nulos por omissão

Em algumas situações a utilização de um valor nulo é mais fácil e mais apropriado para a utilização de um valor padrão.

Suponha que você queira descobrir o que é o salário médio de todos os funcionários em um departamento.
A coluna de salário nem sempre precisa conter um valor significativo, portanto, pode escolher entre as seguintes opções:

  • Permitir valores nulos para o salário coluna
  • Use um valor padrão não nulo (como 0)

Ao permitir nulos pode formular a consulta tão fácil e DB2 fornece a média de todos os salários conhecidos ou registados.
O cálculo não inclui as linhas que contêm valores nulos.
No segundo caso, uma resposta enganosa provavelmente será obtida a menos que o valor é conhecido por omissão diferente de zero para salários desconhecidos e consulta conformidade é feita.

A figura seguinte mostra dois cenários.
A tabela na figura exclui dados de salário para o empregado número 200440 porque a empresa acaba de contratar este empregado e ainda não definiu seu salário.
O cálculo do salário médio para o departamento E21 haste em função se não os valores nulos ou valores não nulos são utilizados omissão.

  • No lado esquerdo da figura é assumido para ser utilizado são os valores nulos.
    Neste caso, o cálculo do salário médio para o departamento tem apenas três funcionários E21 (000320, 000330 e 200340) para os quais os dados estão disponíveis salário.
  • Na parte direita da figura é assumido que um valor por omissão é usado diferente de zero diferente de zero (0).
    Neste caso, o cálculo do salário médio para o departamento E21 inclui todos os quatro funcionários, embora há apenas valida informações sobre os salários para três funcionários.

Como pode ser visto, apenas a utilização de valor nulo resulta em um salário médio preciso para o departamento de E21.

Figura 1. Quando é preferível utilizar valores nulos por omissão

Os valores nulos são diferentes na maioria das situações de modo que dois valores não são iguais nulo entre si.

Exemplo:
O exemplo seguinte mostra como comparar duas colunas para ver se correspondem ou se ambas as colunas são nulos:


WHERE E1.DEPT IS NOT DISTINCT FROM E2.DEPT

Exemplos
Exempo 1
       01  WS-AUXILIARES.
           05 WS-IDX                 PIC  9(02)      VALUE ZEROES.  
           05 TAB-HOST.
              10 TAB-CODEMP          PIC S9(09)      USAGE COMP.
              10 TAB-PRINOME         PIC  X(12).
              10 TAB-SEPARA          PIC  X(01).
              10 TAB-ULTNOME         PIC  X(15).
              10 TAB-CODEPTO         PIC  9(03).
              10 TAB-DATANAS         PIC  X(10).
              10 TAB-VALOR           PIC S9(15)V9(2) USAGE COMP-3.        
           05 INDICADOR-NULOS.
              10 IND-NULO            PIC S9(04) COMP OCCURS 7 TIMES.

           EXEC SQL
                SELECT 
                       TAB_CODEMP
                ,      TAB_PRINOME
                ,      TAB_SEPARA
                ,      TAB_ULTNOME
                ,      TAB_CODEPTO
                ,      TAB_DATANAS
                ,      TAB_VALOR
                INTO  
                      :TAB-HOST :IND-NULO
               FROM   DSN8810.EMP
               WHERE  TAB_CODEMP = :TAB-CODEMP
           END-EXEC.

           MOVE 1 TO WS-IDX
           PERFORM UNTIL WS-IDX GREATER THAN 07
             IF IND-NULO (WS-IDX) NEGATIVE
                EVALUATE IND-NULO (WS-IDX)         
                    WHEN 1 MOVE ZEROES TO TAB-CODEMP
                    WHEN 2 MOVE SPACES TO TAB-PRINOME
                    WHEN 3 MOVE SPACES TO TAB-SEPARA
                    WHEN 4 MOVE SPACES TO TAB-ULTNOME
                    WHEN 5 MOVE ZEROES TO TAB-CODEPTO
                    WHEN 6 MOVE SPACES TO TAB-DATANAS
                    WHEN 7 MOVE ZEROES TO TAB-VALOR  
                END-EVALUATE
             END-IF
             ADD 1 TO WS-IDX
           END-PERFORM	 

Exempo 2
           EXEC SQL DECLARE CUR001 CURSOR FOR                           
                SELECT VALUE(TXXX.NU_AG,0)                              
                ,      VALUE(TXXX.NU_CNTRT_SEQ,0)                       
                ,      VALUE(TXXX.NU_MODALIDADE,0)                      
                ,      VALUE(TXXX.NU_OPERACAO,0)                        
                ,      VALUE(TXXX.NU_SITUACAO,0)                        
                ,      VALUE(TXXX.DT_INCLUSAO,DATE('01.01.0001'))        
                ,      VALUE(TYYY.DE_PRODUTO,' ')                       
                ,      VALUE(TZZZ.NO_SITUACAO,' ')                      
                ,      TXXX.TS_INI_VG_PROD                               
                FROM   EMP.EMPTBXXX_CONTRATO  TXXX                      
                ,      EMP.EMPTBYYY_PRODUTO   TYYY                      
                ,      EMP.EMPTBZZZ_SITUACAO  TZZZ                        
                WHERE  TXXX.NU_PESSOA      = :EMPTBXXX.NU-PESSOA          
                AND    TXXX.NU_MODALIDADE  =  TYYY.NU_MODALIDADE           
                AND    TXXX.NU_OPERACAO    =  TYYY.NU_OPERACAO             
                AND    TXXX.TS_INI_VG_PROD =  TYYY.TS_INI_VG_PROD          
                AND    TXXX.NU_SITUACAO    =  TZZZ.NU_SITUACAO             
                AND    TZZZ.NU_TP_SITUACAO =  1                            
                ORDER BY TXXX.NU_AG           ASC                      
                ,        TXXX.NU_CNTRT_SEQ    DESC                      
           END-EXEC                                                   

Exempo 3
           EXEC SQL DECLARE CUR001 CURSOR WITH HOLD FOR                 
                SELECT VALUE(NU_AVALIACAO, 0)                           
                ,      VALUE(VR_CAPACIDADE_PGTO, 0)                     
                ,      VALUE(DT_INICIO_AVALIAC, DATE('01.01.0001'))     
                ,      VALUE(DT_FIM_AVALIACAO, DATE('01.01.0001'))      
                ,      VALUE(DT_GER_AVALIACAO, DATE('01.01.0001'))      
                ,      VALUE(CO_CONCEITO, ' ')                          
                FROM   EMP.EMPTBXXX_CONTRATO                             
                WHERE  NU_CNTRT_SEQ = :EMPTBXXXX.NU-CNTRT-SEQ             
            END-EXEC                                                     

Exempo 4
      *-----------------------------------------------------------------
       WORKING-STORAGE SECTION.                                         
      *-----------------------------------------------------------------

       01  WS-IND-NULL.                                                 
           03 I-NU-NAT-PROF            PIC S9(004) COMP.                
           03 I-NU-NAT-EMP             PIC S9(004) COMP.                
           03 I-NU-TP-GRNT             PIC S9(004) COMP.                
           03 I-DT-FIM-VG              PIC S9(004) COMP.                

      *-----------------------------------------------------------------
       PROCEDURE DIVISION USING DFHCOMMAREA.                            
      *-----------------------------------------------------------------

           INITIALIZE WS-IND-NULL.                                      
                                                                         
           IF  NU-NAT-PROF EQUAL ZEROES   
               MOVE -1 TO I-NU-NAT-PROF 
           END-IF 
           
           IF  NU-NAT-EMP  EQUAL ZEROES   
               MOVE -1 TO I-NU-NAT-EMP
           END-IF  
         
           IF  NU-TP-GRNT  EQUAL ZEROES   
               MOVE -1 TO I-NU-TP-GRNT
           END-IF   
        
           IF  DT-FIM-VG   EQUAL SPACES   
               MOVE -1 TO I-DT-FIM-VG
           END-IF             
                                                                         
           EXEC SQL                                                     
                INSERT INTO EMP.EMPTBAAA_QUALQUER                          
                     (NU_PC_SCI                                              
                ,     NU_OPERACAO                                            
                ,     NU_MODALIDADE                                          
                ,     PZ_MIN                                                 
                ,     PZ_MAX                                                 
                ,     NU_NAT_SCI                                             
                ,     PC_SCI                                                 
                ,     DT_INI_VG                                              
                ,     NU_NAT_PROF                                            
                ,     NU_NAT_EMP                                             
                ,     NU_TP_GRNT                                             
                ,     DT_FIM_VG)                                             
                VALUES                                                   
                    (:NU-PC-SCI                                             
                ,    :NU-OPERACAO                                           
                ,    :NU-MODALIDADE                                         
                ,    :PZ-MIN                                                
                ,    :PZ-MAX                                                
                ,    :NU-NAT-SCI                                            
                ,    :PC-SCI                                                
                ,    :DT-INI-VG                                             
                ,    :NU-NAT-PROF   :I-NU-NAT-PROF                          
                ,    :NU-NAT-EMP    :I-NU-NAT-EMP                           
                ,    :NU-TP-GRNT    :I-NU-TP-GRNT                           
                ,    :DT-FIM-VG     :I-DT-FIM-VG)                           
            END-EXEC.