我要为SAS转换的代码在PROC SQL使用下面的代码片段:IIF在PROC SQL
UPDATE loan_tape
SET apples = IIF(apples != 0.0, apples, 20.0)
然而IIF()不被PROC SQL认可。我可以实施if/else或某种CASE语句吗?这似乎没有为我工作。
我要为SAS转换的代码在PROC SQL使用下面的代码片段:IIF在PROC SQL
UPDATE loan_tape
SET apples = IIF(apples != 0.0, apples, 20.0)
然而IIF()不被PROC SQL认可。我可以实施if/else或某种CASE语句吗?这似乎没有为我工作。
使用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。
使用case
UPDATE loan_tape
SET apples = case when apples <> 0.0 then apples else 20.0 end
您还可以使用SAS IFN()
功能,这不正是IIF()
做你的榜样,让您的出发点的最小变化。正如戈登所说,尽管如此,使用WHERE
子句可能对此任务更好。
为IFN
文档页面:
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002604573.htm
@JohnHC。 。 。错位的括号。 –
你已经把'WHEN'而不是'WHERE'。 – Longfish
我会避免在SAS中使用'<>'作为运算符。它在SAS数据步骤中的含义与在PROC SQL中的含义不同。 – Tom