我要爲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