適用版本:SQL Server 2012。
IIF 邏輯函數
根據布林運算式求得的解為 true 或 false 而傳回兩值之一。
雖然 IIF() 邏輯函數是 SQL Server 2012版本新增加的功能,但若你已經使用過 VBA(Visual Basic for Applications) 或是 SSRS 決策函數等,那你可能已經使用過 IIF 函數。
語法:
IIF ( boolean_expression, true_value, false_value )
請參考以下的範例程式碼
EX1:認識 IIF() 邏輯函數 與 CASE() 運算式
-- 使用 CASE() 運算式 DECLARE @c1 int =10, @c2 int = 20 SELECT CASE WHEN (@c1 < @c2) THEN N'成立' ELSE N'不成立' END N'判斷結果' GO -- 使用 IIF() 邏輯函數 DECLARE @c1 int =10, @c2 int = 20 SELECT IIF(@c1 < @c2, N'成立', N'不成立') N'判斷結果' GO
-- 01_認識 IIF() 邏輯函數 與 CASE() 運算式
EX2:IIF() 邏輯函數 與 CASE() 運算式:查詢資料表
-- 使用 CASE() 運算式 USE Northwind GO SELECT ProductID, ProductName, UnitsInStock, CASE WHEN UnitsInStock>50 THEN N'高於' ELSE N'低於' END N'安全庫存數量(50)' FROM Products GO -- 使用 IIF() 邏輯函數 SELECT ProductID, ProductName, UnitsInStock, IIF( UnitsInStock>50, N'高於', N'低於') N'安全庫存數量(50)' FROM Products GO
-- 02_IIF() 邏輯函數 與 CASE() 運算式:查詢資料表
EX3:巢狀 IIF (Nested IIF)
-- 巢狀 IIF (Nested IIF) --執行邏輯判斷後,回傳:老爺、夫人、少爺、小姐 DECLARE @gender varchar(1), @maritalstatus varchar(1) SET @gender ='M' SET @maritalstatus = 'M' SELECT IIF(@gender ='M', IIF(@maritalstatus='M','老爺','少爺' ), IIF(@maritalstatus='M','夫人','小姐' )); GO
-- 03_巢狀 IIF (Nested IIF)
-- CASE() 運算式 與 CTE(一般資料表運算式) -- 執行邏輯判斷後,回傳:老爺、夫人、少爺、小姐 WITH tPerson AS ( SELECT * FROM ( VALUES (1,'M','M'), (2,'M','F'), (3,'F','M'), (4,'F','F')) t(eid, gender, maritalstatus) ) SELECT eid, gender, maritalstatus, CASE WHEN gender ='M' AND maritalstatus='M' THEN N'老爺' WHEN gender ='M' AND maritalstatus='F' THEN N'少爺' WHEN gender ='F' AND maritalstatus='M' THEN N'夫人' WHEN gender ='F' AND maritalstatus='F' THEN N'小姐' END N'稱呼' FROM tPerson; GO -- 執行巢狀 IIF 與 CTE(一般資料表運算式) -- 邏輯判斷後,回傳:老爺、夫人、少爺、小姐 WITH tPerson AS ( SELECT * FROM ( VALUES (1,'M','M'), (2,'M','F'), (3,'F','M'), (4,'F','F')) t(eid, gender, maritalstatus) ) SELECT eid, gender, maritalstatus, IIF(gender ='M', IIF(maritalstatus='M','老爺','少爺' ), IIF(maritalstatus='M','夫人','小姐' )) N'稱呼' FROM tPerson; GO
-- 04_執行巢狀 IIF _CASE() 運算式 與 CTE(一般資料表運算式)
EX4:IIF() 邏輯函數:錯誤 NULL
-- 包含 NULL 常數的 IIF SELECT IIF ( 10 > 20, NULL, NULL ) N'判斷結果'; GO /* 錯誤訊息: 訊息 8133,層級 16,狀態 1,行 1 CASE 規格中的結果運算式至少要有一個是 NULL 常數以外的運算式。 */
-- 05_IIF() 邏輯函數:錯誤 NULL
-- 若是改由變數方式:包含 NULL 參數的 IIF DECLARE @c1 INT = NULL; DECLARE @c2 INT = NULL; SELECT IIF ( 1 > 20, @c1, @c2) N'判斷結果'; GO /* 回傳:NULL */
-- 06_IIF() 邏輯函數:回傳 NULL
EX5:IIF() 邏輯函數:回傳式的運算有問題時
-- 布林運算式為真,回傳第一個運算式 -- 其中,第二個運算式會產生分母為 0 的錯誤 DECLARE @c1 int =200, @c2 int=0 SELECT IIF(10>5, @c1+@c2, @c1/@c2) GO
-- 07_布林運算式為真,回傳第一個運算式
-- 布林運算式為假,回傳第二個運算式 -- 其中,第二個運算式會產生分母為 0 的錯誤 DECLARE @c1 int =200, @c2 int=0 SELECT IIF(10>50, @c1+@c2, @c1/@c2) GO /* 錯誤訊息: 訊息 8134,層級 16,狀態 1,行 3 發現除以零的錯誤。 */
-- 08_布林運算式為假,回傳第二個運算式
認識 IIF 邏輯函數
IIF 邏輯函數
根據布林運算式求得的解為 true 或 false 而傳回兩值之一。
語法:
IIF ( boolean_expression, true_value, false_value )
引數說明
(1) boolean_expression
有效的布林運算式。
此引數若不是布林運算式,將會引發語法錯誤。
(2) true_value
當 boolean_expression 求得的解為 true 時所要傳回的值。
(3) false_value
當 boolean_expression 求得的解為 false 時所要傳回的值。
傳回類型
從 true_value 及 false_value 的類型中,傳回優先順序最高的資料類型。
注意事項
IIF 是一種編寫 CASE 陳述式的簡略方法。
其會求得第一個引數所傳遞之布林運算式的解,然後依據求解結果,傳回另外兩個引數之一。
換言之,如果布林運算式為 true,即會傳回 true_value;如果布林運算式為 false 或不明,即會傳回 false_value。
true_value 及 false_value 可以是任何類型。
套用到布林運算式、NULL 處理及傳回類型之 CASE 陳述式的規則,也同樣會套用至 IIF。
IIF 轉換為 CASE 的事實,對此函數的其他方面行為也有影響。
由於 CASE 陳述式最多只可巢狀化到層級 10,因此 IIF 陳述式最多也只可巢狀化至層級 10。
此外,IIF 會以語意相等之 CASE 陳述式,並以遠端處理之 CASE 陳述式的所有行為,從遠端處理到其他伺服器。
參考資料
IIF (Transact-SQL)
http://msdn.microsoft.com/zh-tw/library/hh213574.aspx
CASE (Transact-SQL)
http://msdn.microsoft.com/zh-tw/library/ms181765.aspx
運算式範例 (報表產生器及 SSRS)
http://technet.microsoft.com/zh-tw/library/ms157328
IIf 函式 -- Visual Studio 2008
http://msdn.microsoft.com/zh-tw/library/27ydhh0d(v=vs.90).aspx
IIf 函數 -- Office Access 2007
http://office.microsoft.com/zh-tw/access-help/iif-function-HA001228853.aspx
沒有留言:
張貼留言