2017-02-15 54 views
2

我要为SAS转换的代码在PROC SQL使用下面的代码片段:IIF在PROC SQL

UPDATE loan_tape 
SET apples = IIF(apples != 0.0, apples, 20.0) 

然而IIF()不被PROC SQL认可。我可以实施if/else或某种CASE语句吗?这似乎没有为我工作。

回答

7

使用case

UPDATE loan_tape 
    SET apples = (CASE WHEN apples <> 0.0 THEN apples ELSE 20.0 END) 

其实,用WHERE

UPDATE loan_tape 
    SET apples = 20.0 
    WHERE apples = 0.0 OR apples IS NULL; 

这是在任何数据库中做到这一点的最好办法,因为它限制了行被更新的数量(某些数据库只有在值更改时才进行更新,但将此逻辑表达为过滤器更好)。

我还应该注意,与浮点数与SQL(或任何语言)中的数字进行等同比较是危险的。 SQL具有固定点值(decimal/numeric)。问题是非常非常非常接近零的值倾向于“看起来”像0--类似于0.000000000097。

+0

@JohnHC。 。 。错位的括号。 –

+0

你已经把'WHEN'而不是'WHERE'。 – Longfish

+1

我会避免在SAS中使用'<>'作为运算符。它在SAS数据步骤中的含义与在PROC SQL中的含义不同。 – Tom

-1

使用case

UPDATE loan_tape 
SET apples = case when apples <> 0.0 then apples else 20.0 end