我在数据步骤中使用哈希进行查询,如下所示:
if _n_ = 1 then do;
if 0 then
set TableA;
declare hash A(dataset: "TableA");
A.definekey ("UniqueKeyA" );
A.definedata ("DataA" );
A.definedone();
end;
if _n_ = 1 then do;
if 0 then
set TableB;
declare hash B(dataset: "TableB");
B.definekey ("UniqueKeyB" );
B.definedata ("DataB" );
B.definedone();
end;
rcA = A.find(key:UniqueKeyA);
rcB = B.find(key:UniqueKeyB);
我的印象是,如果数据存在,find
方法返回0,否则返回非零,如果找到数据,则将其放入表中。但是,这些查询会返回rcA
或rcB
的非零值,并仍然会输入值。
明确地说,如果我的原始表是
UniqueKeyA UniqueKeyB
1 A
2 B
3 C
4 D
5 E
和TableA
是
UniqueKeyA DataA
1 'High'
2 'Low'
5 'High
和'TableB是
UniqueKeyB DataA
B 'Hot'
D 'Cold'
E 'Warm'
结果表可能是
UniqueKeyA UniqueKeyB rcA DataA rcB DataB
1 A 0 'High' 42
2 B 0 'Low' 0 'Hot'
3 C 45 'Low' 42 'Hot'
4 D 45 'Low' 0 'Cold'
5 E 0 'High 0 'Warm'
我现在有一个工作
if rcA = 0 then DataA = DataA;
if rcA ^= 0 then DataA = "";
if rcB = 0 then DataB = DataB;
if rcB ^= 0 then DataB = "";
但这似乎没必要,因为我认为find
只有在表返回0时才会写入表。
有谁知道为什么会这样?
如果您需要更多信息,请与我们联系,谢谢!
另外,我还有一个关于这些哈希返回整个表而不是指定列的问题,问题在于:Hash returning entire table - SAS
答案 0 :(得分:2)
这是同一件事的另一个副作用 - if 0 then set tableA
。
通过SET
,MERGE
或UPDATE
语句到达数据步骤的任何变量都将自动RETAIN
,这意味着它不会在数据步骤循环开始时设置为缺失。因此,您需要放弃if 0 then set tableA/B
行(可以用几个length
语句替换它们,每个哈希中每个变量一个)或者执行您正在执行的操作,将它们设置为手动丢失。