SQL - DB2 - Verificar valores NULOS
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.