我最近搬到了SAS 9.4,发现了IFN和IFC功能的奇怪错误。请参阅下面的代码说明IFN功能:
数据a;输入b 8。;datalines;0.11501109.110
;跑;
proc sql; …
对于意外评估结果的讨论是针对Windows 10.0.17763 Build 17763上的SAS 9.4 TS1M4中运行的代码。
3 proc options; 4 run; SAS (r) Proprietary Software Release 9.4 TS1M4
SQL没有缺失值( . , .<letter> )与Step Step和其他Procs相同的概念。 SQL有NULL并且SAS将缺少的值强制转换为NULL,因此存在模糊边缘并且您在那里发现了问题!
.
.<letter>
无法正确评估表达式似乎是9.4 SQL实现处理字面缺失的方式( . )在这种特定情况下的价值观。失败不在 IFN ,而是评估传递给 IFN !
IFN
仅检查逻辑表达式,问题似乎与之无关 IN 。类似的意外评估结果发生时 IN 被分成一系列 OR 秒。具体的因果关系似乎是遗失的文字( . )出现在表达式中 - 这反过来成为9.4 SQL实现内部(解析等)
IN
OR
当超过两个子表达式并且其中一个使用缺失时,肯定似乎是一个错误( . )。适当的补救措施,以及更适合远程或传递处理的措施,将避免使用丢失的文字( . )在您的SQL中使用ANSI null测试运算符 IS NULL 和 IS NOT NULL
IS NULL
IS NOT NULL
data have; b = 9.1; run; proc sql; create table want as select b , b in (.,0) | b > 100 as part1 /* correct result */ , b in (.,0) | b < 1 as part2 /* correct result */ , b > 100 | b < 1 as part3 /* correct result */ , b in (.,0) | b > 100 | b < 1 as parts_null_first /* INCORRECT result */ , b > 100 | b < 1 | b in (.,0) as parts_null_last /* INCORRECT result */ , b=. | b=0 | b > 100 | b < 1 as parts_no_in_null_first /* INCORRECT result */ , b=0 | b > 100 | b < 1 | b= . as parts_no_in_null_last /* correct - weird? */ , b is null | b=0 | b > 100 | b < 1 as parts_is_null /* correct result */ , calculated part1 | calculated part2 | calculated part3 as calc_parts_in_1_expr /* correct result */ from have ; quit;
我没有测试当有问题的表达式在a中时是否出现相同的问题 WHERE caluse。作为DATA步骤中的赋值,表达式不是问题:
WHERE
data want2; set have; parts_null_first = b in (.,0) | b > 100 | b < 1 ; /* correct result */ parts_null_last = b > 100 | b < 1 | b in (.,0); /* correct result */ run;
如果表达式评估'错误'出现在where表达式中,那么where评估引擎更可能是根本原因 - 我相信相同的引擎用于Proc / Data WHERE语句,Dataset WHERE =选项和SQL评估。
可能有一个SAS Note或Hotfix的情况,但我没有去看。
关于测试缺失值的另一个讨论可以在SAS_Tipster中找到 “SAS提示:使用IS MISSING和IS NULL与数字或字符变量” 在communities.sas.com上。重要的一点是在空值的标准测试中使用运算符。
IS MISSING和IS NULL运算符与WHERE语句一起使用,可以处理字符或数字变量。它们也适用于NOT运算符:
文档 总结 IS MISSING predicate 如:
IS MISSING predicate
测试SAS本机数据存储中的SAS缺失值。