Hash find方法输入值,尽管返回非零-SAS

Hash find方法输入值,尽管返回非零-SAS,sas,Sas,我有一个在数据步骤中使用哈希的查询,如下所示: 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 s

我有一个在数据步骤中使用哈希的查询,如下所示:

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
表a

UniqueKeyA     DataA
    1          'High'
    2          'Low'
    5          'High
表B是

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时写入表

有人知道为什么会这样吗

如果您需要更多信息,请告诉我,谢谢


另外,我还有一个关于这些散列返回整个表而不是指定列的问题,问题是:

这是同样事情的另一个副作用-
如果为0,则设置tableA


通过
SET
MERGE
UPDATE
语句到达数据步骤的任何变量都将自动
RETAIN
ed,这意味着它不会在数据步骤循环开始时设置为missing。因此,您需要放弃
if 0,然后设置tableA/B
行(您可以用两个
length
语句替换它们,每个散列中每个变量一个),或者执行您正在执行的操作,手动将它们设置为missing。

再次感谢,非常感谢!