2017-02-15 55 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