рдкреВрд░рд╛ рдиреЛрдЯ

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдУрд░реЗрдХрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрд╛, рдореИрдВрдиреЗ рд╡рд┐рд╖рдпреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЖрдЬрд╝рдорд╛рдпрд╛ред рд╣рд░ рдмрд╛рд░ рдпрд╣ рдмрд╣реБрдд рд▓рдВрдмрд╛ рдирд┐рдХрд▓рд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдиреЗ рд╡рд┐рд▓реНрдбреНрд╕ рдореЗрдВ рдЧрд╣рд░рд╛ рд╡рд┐рд╕реНрдлреЛрдЯ рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рджрд░реНрд╢рдХреЛрдВ рдХреА рд░реБрдЪрд┐ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреА рдореЗрд░реА рд╢реИрд▓реА (рдЖрдИрдПрдордПрдЪрдУ, рдореЗрд░реЗ рд╕реЗ рд▓реЗрдЦрдХ рдмрд╣реБрдд рдирд╣реАрдВ рд╣реИ) рдХреЗ рд╕рдВрдмрдВрдз рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрднрд╡ рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдХреБрдЫ рдиреЛрдЯ:So.

рдореБрдЦреНрдп рдмрд┐рдВрджреБ

рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп NULL рдХрд╛ рдЕрд░реНрде рд╣реИ рдбреЗрдЯрд╛ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐, рдЗрд╕ рддрдереНрдп рдХрд╛ рдПрдХ рдмрдпрд╛рди рдХрд┐ рдореВрд▓реНрдп рдЕрдЬреНрдЮрд╛рдд рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЙрд▓рдо рдФрд░ рдЪрд░ рдЗрд╕ рдорд╛рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдЙрди рдкрд░ NOT NULL рдмрд╛рдзрд╛ NOT NULL рдЬрд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, DBMS рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рдПрдХ рдкреВрд░реНрдг NOT NULL рдЬреЛрдбрд╝рддрд╛ рд╣реИред

NULL рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рджреВрд╕рд░реЗ NULL рдХреА рднреА рдирд╣реАрдВред рдЖрдк рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: = , < , > , like ... рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ NULL != NULL рд╕рдЪ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рд╕реЗ рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рддреЛ рдЭреВрдареА рдирд╣реАрдВ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╢рд░реНрддреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп, рдУрд░реЗрдХрд▓ рдФрд░ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред NULL рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рдПрдХ рддрддреНрд╡ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг, рдПрдХ рдФрд░ рд░рд╛рдЬреНрдп рд╣реИ - ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдУрд░реЗрдХрд▓ рджреЛ-рдореВрд▓реНрдпрд╡рд╛рди рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рддреАрди-рдореВрд▓реНрдпрд╡рд╛рди рддрд░реНрдХ рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рджрд╛рджрд╛рдЬреА рдХреЛрдбрдб рдиреЗ рдЕрдкрдиреЗ рд░рд┐рд▓реЗрд╢рдирд▓ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдУрд░реЗрдХрд▓ рдПрдХ рд░рд┐рд▓реЗрд╢рдирд▓ рдбреАрдмреАрдПрдордПрд╕ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдирдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред "рдЕрдЬреАрдм" рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рддреАрди-рдореВрд▓реНрдпрд╡рд╛рди рддрд░реНрдХ рдХреА рд╕рддреНрдп рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдЗрд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдВрдЧреНрд░реЗрдЬрд╝реА рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░: рдереНрд░реА-рд╡реИрд▓реНрдпреВ_рд▓реЙрдЬрд┐рдХ ред

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдмреВрд▓рд┐рдпрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреА рд╣реИ:
 create procedure test_bool( p_bool boolean ) is begin case when p_bool = true then dbms_output.put_line('TRUE'); when p_bool = false then dbms_output.put_line('FALSE'); else dbms_output.put_line('UNKNOWN'); end case; end test_bool; 

рдФрд░ рдХрдВрд╕реЛрд▓ рдХреЛ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ:
 set serveroutput on 

рдкрд░рд┐рдЪрд┐рдд рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░ NULL рд╕реЗ рдкрд╣рд▓реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ:
 exec test_bool( null = null ); -- UNKNOWN exec test_bool( null != null ); -- UNKNOWN exec test_bool( null = 'a' ); -- UNKNOWN exec test_bool( null != 'a' ); -- UNKNOWN 


NULL рд╕реЗ рддреБрд▓рдирд╛


рд╡рд┐рд╢реЗрд╖ IS NULL рдФрд░ IS NOT NULL рдСрдкрд░реЗрдЯрд░ IS NOT NULL рдЬреЛ NULLs рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред IS NULL рдирд╣реАрдВ рд╣реИ рдФрд░ рдЧрд▓рдд рд╣реИ, рддреЛ IS NULL рд╕рдЪ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

 select case when null is null then 'YES' else 'NO' end from dual; -- YES select case when 'a' is null then 'YES' else 'NO' end from dual; -- NO 

рддрджрдиреБрд╕рд╛рд░, IS NOT NULL рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо IS NOT NULL рдХрд░рддрд╛ рд╣реИ: рдпрджрд┐ рдСрдкрд░реЗрдВрдб рдорд╛рди рдиреЙрди-NULL рдФрд░ рдЧрд▓рдд рд╣реИ, рддреЛ рдпрд╣ рд╕рд╣реА рд╣реИ: рдпрджрд┐ рдпрд╣ NULL рд╣реИ:

 select case when 'a' is NOT null then 'YES' else 'NO' end from dual; -- YES select case when null is NOT null then 'YES' else 'NO' end from dual; -- NO 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд╛рдкрддрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдирд┐рдпрдо рдХреЗ рдХреБрдЫ рдЕрдкрд╡рд╛рдж рд╣реИрдВред рдкрд╣рд▓рд╛ DECODE рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬреЛ рджреЛ NULL рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рдорддреБрд▓реНрдп рдорд╛рдирддрд╛ рд╣реИред рджреВрд╕рд░реЗ, рдпреЗ рд╕рдордЧреНрд░ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИрдВ: рдпрджрд┐ рджреЛ рдХреБрдВрдЬрд┐рдпреЛрдВ рдореЗрдВ рдЦрд╛рд▓реА рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╕рднреА рдЧреИрд░-рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдУрд░реЗрдХрд▓ рдЗрди рджреЛрдиреЛрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд╕рдорддреБрд▓реНрдп рдорд╛рдирддрд╛ рд╣реИред

DECODE рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рддрд╛ рд╣реИ:
 select decode( null , 1, 'ONE' , null, 'EMPTY' --     , 'DEFAULT' ) from dual; 

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рдордЧреНрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдФрд░ NULL

рдЖрдорддреМрд░ рдкрд░, рд░рд╛рдЬреНрдп рдХреЛ рддрд░рд╣ рд╣реА рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ x = NULL рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ WHERE рдорд┐рд▓рддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рднреА рдкрдВрдХреНрддрд┐ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдЕрдВрддрд░ рд╣реИ: рдпрджрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ () рд╕рд╣реА () рд╣реИ, рддреЛ () рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рддрд╛рд░реНрдХрд┐рдХ рдСрдкрд░реЗрдЯрд░реНрд╕ AND рдФрд░ OR рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдмрд╛рд░реАрдХрд┐рдпреЛрдВред

рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкрд░рд┐рдгрд╛рдо рдХреЛ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ:
 select 1 from dual where dummy = null; --     

рдЕрдЬреНрдЮрд╛рдд рд╕реЗ рдЗрдирдХрд╛рд░ рдЕрдЬреНрдЮрд╛рдд рджреЗрддрд╛ рд╣реИ:
 exec test_bool( not(null = null) ); -- UNKNOWN exec test_bool( not(null != null) ); -- UNKNOWN exec test_bool( not(null = 'a') ); -- UNKNOWN exec test_bool( not(null != 'a') ); -- UNKNOWN 

OR рдСрдкрд░реЗрдЯрд░:
 exec test_bool( null or true ); -- TRUE <- !!!!! exec test_bool( null or false ); -- UNKNOWN exec test_bool( null or null ); -- UNKNOWN 

AND рдСрдкрд░реЗрдЯрд░:
 exec test_bool( null and true ); -- UNKNOWN exec test_bool( null and false ); -- FALSE <- !!!!! exec test_bool( null and null ); -- UNKNOWN 


рдСрдкрд░реЗрдЯрд░реЛрдВ рдореЗрдВ рдФрд░ рдирд╣реАрдВ рдореЗрдВ


рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрджрдо рдЙрдард╛рдПрдВрдЧреЗред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХреЙрд▓рдо A рдФрд░ рдЪрд╛рд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ T рдмрдирд╛рдПрдВ: 1, 2, 3 рдФрд░ NULL
 create table t as select column_value a from table(sys.odcinumberlist(1,2,3,null)); 

PLUSTRACE рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдЯреНрд░реЗрд╕рд┐рдВрдЧ PLUSTRACE рд╣реИрдВ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ PLUSTRACE рднреВрдорд┐рдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рдЯреНрд░реЗрд╕ рд╕реЗ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ, рдХреЗрд╡рд▓ рдлрд╝рд┐рд▓реНрдЯрд░ рднрд╛рдЧ рдХреЛ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╢рд░реНрддреЗрдВ рдХреНрдпрд╛ рд╣реИрдВред
 set autotrace on 

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдП рд╣реИрдВ, рдЪрд▓реЛ рдЕрдм рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рдЙрди рд╕рднреА рд░рд┐рдХреЙрд░реНрдбреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреЛ рд╕реЗрдЯ рдореЗрдВ рд╣реИрдВ (1, 2, NULL) :
 select * from t where a in(1,2,null); --  [1,2] -- Predicate Information: -- filter("A"=1 OR "A"=2 OR "A"=TO_NUMBER(NULL)) 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, NULL рд╡рд╛рд▓реА рдкрдВрдХреНрддрд┐ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ "A"=TO_NUMBER(NULL) рдХреА рдЧрдгрдирд╛ рдиреЗ рд░рд╛рдЬреНрдп "A"=TO_NUMBER(NULL) рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ред NULL рдХреЛ рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 select * from t where a in(1,2) or a is null; --  [1,2,NULL] -- Predicate Information: -- filter("A" IS NULL OR "A"=1 OR "A"=2) 

рдЪрд▓реЛ рдЕрдм рдореЗрдВ NOT IN рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
 select * from t where a not in(1,2,null); -- no rows selected -- Predicate Information: -- filter("A"<>1 AND "A"<>2 AND "A"<>TO_NUMBER(NULL)) 


рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рднреА рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ! рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдЯреНрд░рд┐рдкрд▓ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдЬреЛ DBMS рдХреЗрд╕ A=3 рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  3 <> 1 рдФрд░ 3 <> 2 рдФрд░ 3 <> tonnumber (NULL)
    \ / \ / \ /
    рд╕рдЪ рдФрд░ рд╕рдЪ рдФрд░ рдЕрдЬреНрдЮрд╛рдд
        \ / /
         рд╕рддреНрдп рдФрд░ рдЕрдЬреНрдЮрд╛рдд
             \ /
              рдЕрдЬреНрдЮрд╛рдд 

рддреАрди-рдореВрд▓реНрдпрд╡рд╛рди рддрд░реНрдХ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг, NOT IN NULLs рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИ: рдЬреИрд╕реЗ рд╣реА NULL рдЪрдпрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░реЗрдВред

рд░рд┐рдХреНрдд рдФрд░ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ


рдпрд╣рд╛рдБ, Oracle ANSI SQL рдорд╛рдирдХ рд╕реЗ рджреВрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ NULL рдФрд░ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╕рдорд╛рдирддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬреЛ рд╕рдордп-рд╕рдордп рдкрд░ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рдмрд╣реБ-рдкреГрд╖реНрда рдЪрд░реНрдЪрд╛рдУрдВ рдХреЛ рдЬрдиреНрдо рджреЗрддреА рд╣реИ, рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рдорд▓ рдбрд╛рд▓рдирд╛ рдФрд░ рдХрдард┐рди рд╡рд┐рд╡рд╛рджреЛрдВ рдХреЗ рдЕрдиреНрдп рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдЧреБрдг рд╣реИрдВред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдУрд░реЗрдХрд▓ рд╕реНрд╡рдпрдВ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рднрд▓реЗ рд╣реА рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЕрдм NULL рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдЖрдЬ рдЗрд╕ DBMS рдХреЗ рд▓рд┐рдП рдЗрддрдиреА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рдирд╛ рд╢рд╛рдпрдж рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реЛред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдиреНрд╣реЛрдВрдиреЗ рдбреАрдмреАрдПрдордПрд╕ рдХреЗ рд╕рд╛рддрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг (1992-1996) рдХреЗ рд╕рд╛рде рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдЕрдм рдмрд╛рд░рд╣рд╡реЗрдВ рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реИред

NULL рдФрд░ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдорддреБрд▓реНрдп рд╣реИрдВ:
 exec test_bool( '' is null ); -- TRUE 


рдПрдХ рдХрдард┐рди рд╡рд┐рд╡рд╛рдж рдХреА рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╡рд┐рд╢реЗрд╖рддрд╛:
 select count(*) comments_count, avg(c.vote) avg_vote from habr.comments c join habr.posts p on( c.post_id = p.id ) where lower(p.title) like '%%' and lower(p.title) like '%%'; COMMENTS_COUNT AVG_VOTE --------------- --------- 100500 -100 

рдпрджрд┐ рдЖрдк рдХреНрд▓рд╛рд╕рд┐рдХ рдХреЗ рдкреВрд░реНрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░реВрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд░рд┐рдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ NULL рдХреА рд╕рдорд╛рдирддрд╛ рдХрд╛ рдХрд╛рд░рдг рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ varchars рдФрд░ NULLs рдХреЗ рднрдВрдбрд╛рд░рдг рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдУрд░реЗрдХрд▓ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╡рд╛рд▓реЗ рддрд╛рд▓рд┐рдХрд╛ рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╣реЗрдбрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдХреЗ рдХреЙрд▓рдо рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрдВрдн рдХреЛ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╕реНрддрдВрдн рдореЗрдВ рдбреЗрдЯрд╛ рд▓рдВрдмрд╛рдИ (1 рдпрд╛ 3 рдмрд╛рдЗрдЯреНрд╕) рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбреЗрдЯрд╛ рд╕реНрд╡рдпрдВред рдпрджрд┐ varchar2 рдореЗрдВ рд╢реВрдиреНрдп рд▓рдВрдмрд╛рдИ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдмрд╛рдЗрдЯ рдкрд░ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рди 0xFF рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдлрд╝реАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред NULL рдХреЛ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдХреЛрдИ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИ, рдФрд░ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдлрд╝реАрд▓реНрдб рдореЗрдВ 0xFF рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдУрд░реЗрдХрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдмреЗрд╢рдХ, рдЗрди рджреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╢реБрд░реБрдЖрддреА рд╕рдордп рд╕реЗ рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рдерд╛ред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рд░рд┐рдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ NULL рдХреА рд╕рдорд╛рдирддрд╛ рдХрд╛рдлреА рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред "рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ" рдирд╛рдо рдХрд╛ рдЕрд░реНрде рд╣реИ, рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐, рдЦрд╛рд▓реАрдкрди, рдбреЛрдирдЯ рд╕реЗ рдЫреЗрджред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, NULL рдХрд╛ рдорддрд▓рдм рдПрдХ рд╣реА рдЪреАрдЬ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЕрдкреНрд░рд┐рдп рдкрд░рд┐рдгрд╛рдо рд╣реИ: рдпрджрд┐ рдЖрдк рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢реВрдиреНрдп рд╣реИ, рддреЛ NULL рдХреА рд▓рдВрдмрд╛рдИ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА length('') рд╢реВрдиреНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧреА, рд╢реВрдиреНрдп рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛: рдЖрдк рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдПрдХреНрд╕рдкреНрд░реЗрд╢рди val = '' рд╕реНрдЯреЗрдЯ рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ val = NULL рдмрд░рд╛рдмрд░ val = NULL ред

рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 select length('') from dual; -- NULL 

рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ:
 exec test_bool( 'a' != '' ); -- UNKNOWN 

рдУрд░реЗрдХрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЖрд▓реЛрдЪрдХреЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рдЦрд╛рд▓реА рд▓рд╛рдЗрди рдХрд╛ рдорддрд▓рдм рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд┐рдХреНрд░реА рдкреНрд░рдмрдВрдзрдХ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХрд╛рд░реНрдб рднрд░рддрд╛ рд╣реИред рд╡рд╣ рдЕрдкрдиреЗ рд╕рдВрдкрд░реНрдХ рдлреЛрди рдирдВрдмрд░ (555-123456) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╣ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЕрдЬреНрдЮрд╛рдд (NULL) рд╣реИ, рдФрд░ рд╡рд╣ рдпрд╣ рднреА рд╕рдВрдХреЗрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕рдВрдкрд░реНрдХ рдлреЛрди рдирдВрдмрд░ (рдЦрд╛рд▓реА рд▓рд╛рдЗрди) рдирд╣реАрдВ рд╣реИред рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреА рдПрдХ oracle рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рддрд░реНрдХ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рд╢реНрди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХрднреА рднреА рдкреВрд░реНрдг рдЙрддреНрддрд░ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ: рдкреНрд░рдмрдВрдзрдХ "рдЯреЗрд▓реАрдлреЛрди" рдлрд╝реАрд▓реНрдб рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рд░реЗрдЦрд╛ рдХреИрд╕реЗ рджрд░реНрдЬ рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд╣ рдЗрд╕реЗ NULL рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдЧрд╛? рдмреЗрд╢рдХ, рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА ...

рджрд░рдЕрд╕рд▓, рдЬрдм рдкреАрдПрд▓ / рдПрд╕рдХреНрдпреВрдПрд▓ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдЗрдВрдЬрди рдХреЗ рдЕрдВрджрд░ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ NULL рдЕрд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рдВрдЧреНрд░рд╣ рдЖрдкрдХреЛ рдПрдХ рддрддреНрд╡ рдХреЛ '' рд╕реВрдЪрдХрд╛рдВрдХ '' (рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдХреЗ рд╕рд╛рде рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдЖрдкрдХреЛ рдПрдХ рддрддреНрд╡ рдХреЛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ:

 declare procedure empty_or_null( p_val varchar2 ) is type tt is table of varchar2(1) index by varchar2(10); t tt; begin if p_val is not null then dbms_output.put_line(' '); else --      p_val t(p_val) := 'x'; -- ! ,   dbms_output.put_line(' '); end if; exception --     p_val  . , NULL when others then dbms_output.put_line('NULL'); end; begin empty_or_null( 'qwe' ); --   empty_or_null( '' ); --   empty_or_null( NULL ); -- NULL end; 

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреЗ рдЭрдЧрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЙрдХ рд╕реЗ рдирд┐рдпрдо рд╕реАрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ: рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдЕрдкреНрд░рднреЗрджреНрдп рдореЗрдВ NULLред

рдорда рдирд▓

рдпрд╣ рдЫреЛрдЯрд╛ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдмреАрдпрд░ рдХреЗ рд▓рд┐рдП рд╢реБрдХреНрд░рд╡рд╛рд░ рд░рд╛рдд рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рд╢реБрдХреНрд░рд╡рд╛рд░ рдХреА REN-TV рдлрд┐рд▓реНрдо рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдлред рдЙрд╕рдХрд╛ рдЖрд▓рд╕реНрдп рджреВрд░ рдХрд░реЛ, рдореБрдЭреЗ рдорд╛рдл рдХрд░реЛред

рдЯрд╛рд╕реНрдХред рдХреЛрд▓реНрд╣рд╛ рдХреЗ рд╕рд╛рде рд╢рд╛рджреА рд╕реЗ рдкрд╣рд▓реЗ рдорд╛рд╢рд╛ рдХреЗ рдкрд╛рд╕ рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░реЗрдореА рдереЗред рдХреЛрд▓реНрдпрд╛ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рд╢рд╛рджреА рдХреЗ рдмрд╛рдж рдорд╛рд╢рд╛ рдиреЗ рдЙрд╕рдХреЗ рд╕рд╛рде рд╕рд╛рд╢рд╛ рдФрд░ рд╡рд╛рдЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕реЗрдХреНрд╕ рдХрд┐рдпрд╛ рдерд╛ред рдХреЛрд▓реНрд╣рд╛ рдХреЛ рдкреНрд░реЗрдорд┐рдпреЛрдВ рдорд╛рд╢рд╛ рдХреА рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреЛрд▓реНрдпрд╛ рдХреА рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ: рдорд╛рд╢рд╛ рдХреЗ рдкреНрд░реЗрдорд┐рдпреЛрдВ рдХреА рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛ рдЬрдм рддрдХ рдХрд┐ рд╢рд╛рджреА рд╕рднреА рдЧрдгрдирд╛рдУрдВ рдХреЛ рдПрдХ рдореВрд▓реНрдп рддрдХ рдХрдо рдирд╣реАрдВ рдХрд░ рджреЗрддреА - рдпрд╣ рдЕрдЬреНрдЮрд╛рдд рд╣реИред рдУрд░реЗрдХрд▓, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдУрд░реЗрдХрд▓ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рдордиреЛрд╡рд┐рдЬреНрдЮрд╛рди рдХреА рд▓рдбрд╝рд╛рдИ рдореЗрдВ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕ рдкреНрд░рд╢реНрди рдореЗрдВ рдЖрдЧреЗ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдУрд░реЗрдХрд▓ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдИрдорд╛рдирджрд╛рд░ рд╣реИ: рдХреЛрд▓реНрдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╣ рдордиреЛрд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рддреБрд░рдВрдд рдХрд╣реЗрдЧрд╛: "рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛":
 select decode( null + 10, null, '', '') a from dual; --  select decode( null * 10, null, '', '') a from dual; --  select decode( abs(null), null, '', '') a from dual; --  select decode( sign(null), null, '', '') a from dual; --  

рдХреЙрдирдХрдиреЗрд╢рди рдЕрд▓рдЧ рд╣реИ: рдЖрдк NULL рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЗрд╕реЗ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред рдРрд╕реА рджреЛрдпрдо рджрд░реНрдЬреЗ рдХреА рдиреАрддрд┐ рд╣реИред
 select null ||'AA'|| null ||'BB'|| null from dual; -- AABB 


рдкреВрд░реНрдг рдФрд░ рд╕рдордЧреНрд░ рдХрд╛рд░реНрдп


COUNT рдХреЗ рдЕрдкрд╡рд╛рдж (рдФрд░ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛) рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ рд╕рднреА рд╕рдордЧреНрд░ рдХрд╛рд░реНрдп, рдЧрдгрдирд╛ рдореЗрдВ рдЦрд╛рд▓реА рдорд╛рдиреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╡реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдЪрдордХрддрд╛ NULL рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрдЬреНрдЮрд╛рдд рдорд╛рди рдореЗрдВ рд▓рд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SUM рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ (1, 3, null, 2) рдХреЛ рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рд╡рд╣ рдЦрд╛рд▓реА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
1 + 3 = 4; 4 + null = null; null + 2 = null 1 + 3 = 4; 4 + null = null; null + 2 = null ред
рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рд╕рдореБрдЪреНрдЪрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рддрд░рд╣ рдХреА рдЧрдгрдирд╛ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдФрд░ рдбреЗрдЯрд╛ рдЧреЛрджрд╛рдореЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдмрд╡рд╛рд╕реАрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ ... Brrrrr ...

рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ред рдХрдИ рдмрд╛рд░ рдиреАрдЪреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 create table agg( id int, n int ); insert into agg values( 1, 1 ); insert into agg values( 2, 3 ); insert into agg values( 3, null ); insert into agg values( 4, 2 ); commit; 

рдЕрд╢рдХреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдореБрдЪреНрдЪрдп рджреНрд╡рд╛рд░рд╛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 select sum(n) from agg; -- 6 

COUNT рд▓рд╛рдЗрди рдХрд╛рдЙрдВрдЯ рдлрд╝рдВрдХреНрд╢рди, рдпрджрд┐ COUNT(*) рдпрд╛ COUNT() рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЦрд╛рд▓реА рдорд╛рдиреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ COUNT() рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЦрд╛рд▓реА рдорд╛рдиреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдирд┐рд░рдВрддрд░ рдХреЗ рд╕рд╛рде:
 select count(*) from agg; -- 4 select count(1+1) from agg; -- 4 select count(user) from agg; -- 4 

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде:
 select count(n) from agg; -- 3 select count(id) from agg; -- 4 select count(abs(n)) from agg; -- 3 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, AVG рдЬреИрд╕реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рдЦрд╛рд▓реА рдорд╛рдиреЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХреНрд╖реЗрддреНрд░ N рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо (1+3+2)/3 , рди рдХрд┐ (1+3+2)/4 ред рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдФрд╕рдд рдХреА рдРрд╕реА рдЧрдгрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди рд╣реИ - NVL рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 select avg(n) from agg; -- (1 + 3 + 2) / 3 = 2 select avg(nvl(n,0)) from agg; -- (1 + 3 + 0 + 2) / 4 = 1.5 

рдпрджрд┐ рд╡реЗ рдХрд┐рд╕реА рдЦрд╛рд▓реА рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рдпрд╛ рдпрджрд┐ рдЙрд╕рдореЗрдВ рдХреЗрд╡рд▓ NULLs рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдПрдЧреНрд░реАрдЧреЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ UNKNOWN рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЕрдкрд╡рд╛рдж рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП REGR_COUNT рдФрд░ COUNT() рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВред рд╡реЗ рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗред

рдХреЗрд╡рд▓ NULLs рдХрд╛ рдбреЗрдЯрд╛ рд╕реЗрдЯ:
 select sum(n) from agg where n is null; --  select avg(n) from agg where n is null; --  select regr_count(n,n) from agg where n is null; -- 0 select count(n) from agg where n is null; -- 0 

рдЦрд╛рд▓реА рдбреЗрдЯрд╛рд╕реЗрдЯ:
 select sum(n) from agg where 1 = 0; --  select avg(n) from agg where 1 = 0; --  select regr_count(n,n) from agg where 1 = 0; -- 0 select count(n) from agg where 1 = 0; -- 0 

OLAP рдореЗрдВ NULL


рдЗрдХрд╛рдЗрдпреЛрдВ рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВред рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрд╣реБрдЖрдпрд╛рдореА рдкреВрд░реНрдг рдХреНрдпреВрдмреНрд╕ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдбреЗрдЯрд╛ рдХреА рдХрдореА рдФрд░ рдЖрдпрд╛рдо рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣реАрдХрд░рдг рдХрд╛ рд╕рдВрдХреЗрдд рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдШреГрдгрд┐рдд рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рджреЛ рд╣рд╛рдЗрдкреЛрд╕реНрдЯреЗрд╕ рдХреЛ рджреГрд╖реНрдЯрд┐ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд┐рд╢реЗрд╖ GROUPING рдФрд░ GROUPING_ID рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдирдХреА рдПрдХ рддреЗрдЬ рдЖрдВрдЦ рд╣реИред рдпрджрд┐ рдЖрдпрд╛рдо рдХреЙрд▓рдо рдореЗрдВ NULL рдХрд╛ рдЕрд░реНрде рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдореВрд╣рди GROUPING() рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдпрджрд┐ рдЗрд╕ рдХреЙрд▓рдо рдФрд░ рд╢реВрдиреНрдп рд╕реЗ рд╕рдореВрд╣реАрдХрд░рдг рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИ рдпрджрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рди рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, NULL)ред GROUPING_ID рдлрд╝рдВрдХреНрд╢рди GROUPING s рд╕реЗ рдереЛрдбрд╝рд╛ рд╡реЗрдХреНрдЯрд░ рд╣реИ, рдЗрд╕ рдиреЛрдЯ рдореЗрдВ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢рд╛рдирджрд╛рд░ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмрд╣реБрднрд┐рдиреНрдирд░реВрдкреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ NULL рджреНрд╡реИрддрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдРрд╕реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдЕрд░рд╛рдЬрдХ рдЬрд╛рдирдХрд╛рд░реАред рдиреАрдЪреЗ GROUPING рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдФрд░ рд╡реЗрд▓рдХрдо рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕рд┐рдВрдЧ рдЧрд╛рдЗрдб, рдЕрдзреНрдпрд╛рдп 21 рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдПред

рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕реБрд╡рд┐рдзрд╛ sqlplus: рдЬрдм рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ, NULL рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд╣реИ:
 set null [NULL] 

рдПрдХ рдмрд╣реБрдЖрдпрд╛рдореА рдШрди рдореЗрдВ NULL рджреНрд╡реИрддрд╡рд╛рдж рдХреА рдЬрд╛рдБрдЪ:
 with t as ( --   1  select 'IVAN' customer, 'KEFIR' product, 1 qty from dual union all --    2  select NULL customer, 'MOLOKO' product, 2 qty from dual union all --   2  select 'IVAN' customer, 'MOLOKO' product, 2 qty from dual ) select customer cust, grouping(customer) grp_c , product prod, grouping(product) grp_p , sum(qty) qty from t group by cube(customer, product) order by grp_c, grp_p; CUST GRP_C PROD GRP_P QTY ---- ----- ------ ----- ---- [NULL] 0 MOLOKO 0 2 --    2   IVAN 0 KEFIR 0 1 --   1   IVAN 0 MOLOKO 0 2 --   2   IVAN 0 [NULL] 1 3 --   3    [NULL] 0 [NULL] 1 2 --    2    [NULL] 1 MOLOKO 0 4 --    4   [NULL] 1 KEFIR 0 1 --    1   [NULL] 1 [NULL] 1 5 --    5    


рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рд░рд╣рддрд╛ рд╣реИ


рдпрд╣ рдмрд╣реБрдд рд▓рдВрдмрд╛ рдирд┐рдХрд▓рд╛, рдЗрд╕рд▓рд┐рдП рд╕реВрдЪрдирд╛ рдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рдХрд╛рдЯрдирд╛ рдкрдбрд╝рд╛ред рдЕрд░реНрдерд╛рддреН:
рд▓реЗрдЦрдХ рдХреА рдЕрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд▓реЛрдЪрдирд╛, рдкрд░рд┐рд╡рд░реНрдзрди рдФрд░ рдЖрдмрдВрдЯрди (рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ) рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рджрд░рдЕрд╕рд▓, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

Source: https://habr.com/ru/post/In127327/


All Articles