哈希查找方法输入值尽管返回非零 - SAS

时间:2013-12-04 22:20:22

标签: 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 
        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,否则返回非零,如果找到数据,则将其放入表中。但是,这些查询会返回rcArcB的非零值,并仍然会输入值。

明确地说,如果我的原始表是

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

1 个答案:

答案 0 :(得分:2)

这是同一件事的另一个副作用 - if 0 then set tableA

通过SETMERGEUPDATE语句到达数据步骤的任何变量都将自动RETAIN,这意味着它不会在数据步骤循环开始时设置为缺失。因此,您需要放弃if 0 then set tableA/B行(可以用​​几个length语句替换它们,每个哈希中每个变量一个)或者执行您正在执行的操作,将它们设置为手动丢失。