SQL - DB2 - Verificar 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:
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:
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.
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
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
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
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
*----------------------------------------------------------------- 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.