Proc SQL中的IIF

时间:2017-02-15 11:30:13

标签: sql sas

我想翻译以下代码片段,以便在Proc SQL for SAS中使用:

Nearby.Messages
      .publish(googleApiClient, mPubMessage, options)
      .setResultCallback(new ResultCallback<Status>() {
            @Override
            public void onResult(@NonNull Status status) {
            }
      });

然而,PROC SQL无法识别IIF()。我可以实现if / else或某种CASE语句吗?这似乎都不适合我。

3 个答案:

答案 0 :(得分: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)。问题是非常非常非常接近于零的值倾向于&#34;外观&#34;像0 - 像0.000000000097。

答案 1 :(得分:2)

您还可以使用SAS IFN()功能,该功能完全符合IIF()在您的示例中所做的操作,从您的起点开始进行最小的更改。正如戈登所说,使用WHERE子句可能更适合这项任务。

IFN的文档页面:

http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002604573.htm

答案 2 :(得分:-1)

使用case

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