PROC SQL 错误地消除了从 Oracle 数据库中提取的缺失值

PROC SQL Incorrectly Eliminating Missing Values in pull from Oracle data base

当我不希望它们被删除时,我所有的缺失值都被删除了。我假设 SAS 和 Oracle 表现不佳 - 但我不知道解决方案。如果您能提供有关此错误的任何想法,谢谢。

观察字符字段SEX有缺失值:

data test ;
  input name $ sex $ age city $;
  if sex = "NA" then sex=' ';
  if city = "Unk" then city = ' ';
  cards;
Gene  M  62 Saginaw
Cyndi F    45 Unk 
Alice  NA  51 Bay City       
Bob   M   55 Unk
;
proc print data=test; run; 

观察到我可以过滤 SEX 并且仍然有缺失值:

proc sql; 
create table que1 as 
select * from test where sex 
not in ('F','M'); 
quit;
proc sql; select * from que1; quit;

观察通过 libname 连接从 Oracle table 提取原始数据:

proc sql; 
create table test as 
select * from dss.student_registrations
where term_code gt '201500'
  and row_type = 'E'
/*  and final_grade not in ('AU','WU') */
;quit;
proc freq data=test; tables final_grade / missing; run; 

现在我将限制设置为 final_grade,所有缺失值都消失了:

proc sql; 
create table test as 
select * from dss.student_registrations
where term_code gt '201500'
  and row_type = 'E'
  and final_grade not in ('AU','WU')
;quit;
proc freq data=test; tables final_grade / missing; run; 

SAS 具有二进制逻辑 (true/false)。如果 Final_Grade 在 SAS 中为 null,则 Final_Grade NOT IN ('AU','WU') 将为真。 Oracle 具有三元逻辑(true/false/未知)。如果 Final_Grade 在 Oracle 中为 null,则 Final_Grade NOT IN ('AU','WU') 将是未知的。

虽然您正在编写 SAS 代码,但它会将代码传递给 Oracle 进行处理。建议你试试:

where term_code gt '201500'
and row_type = 'E'
and (final_grade not in ('AU','WU') or final_grade is Null)

SAS 程序员从 RDBMS 读取时遇到的这个问题和许多其他问题在 Mike Rhoads 的一篇不错的论文中得到了解决,http://support.sas.com/resources/papers/proceedings09/141-2009.pdf