对于意外评估结果的讨论是针对Windows 10.0.17763 Build 17763上的SAS 9.4 TS1M4中运行的代码。
3 proc options;
4 run;
SAS (r) Proprietary Software Release 9.4 TS1M4
</code>
SQL没有缺失值(
.
,
.
)与Step Step和其他Procs相同的概念。 SQL有NULL并且SAS将缺少的值强制转换为NULL,因此存在模糊边缘并且您在那里发现了问题!
无法正确评估表达式似乎是9.4 SQL实现处理字面缺失的方式(
.
)在这种特定情况下的价值观。失败不在
IFN
,而是评估传递给
IFN
!
仅检查逻辑表达式,问题似乎与之无关
IN
。类似的意外评估结果发生时
IN
被分成一系列
OR
秒。具体的因果关系似乎是遗失的文字(
.
)出现在表达式中 - 这反过来成为9.4 SQL实现内部(解析等)
当超过两个子表达式并且其中一个使用缺失时,肯定似乎是一个错误(
.
)。适当的补救措施,以及更适合远程或传递处理的措施,将避免使用丢失的文字(
.
)在您的SQL中使用ANSI 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;
</code>
我没有测试当有问题的表达式在a中时是否出现相同的问题
WHERE
caluse。作为DATA步骤中的赋值,表达式不是问题:
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;
</code>
如果表达式评估’错误’出现在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
如:
测试SAS本机数据存储中的SAS缺失值。