2012-04-18 212 views
1

我正在使用DB2 v9DB2條件WHERE子句

我有一個帶有參數的存儲過程,可能會以空字符串的形式傳入。這裏somer僞代碼爲我想要做的:

WHERE myColumn.name = 
    IF param1 = '' THEN 
     **disregard this param, all column values are eligible** 
    ELSE 
     myColumn.name = param1; 

基本上只是忽略參數,如果它是一個空字符串。如果不是,則將其作爲WHERE子句中的過濾器應用。這在DB2中可以做到嗎?

回答

5
SELECT ... 
FROM ... 
WHERE param1 = '' 
    OR myColumn.name = param1 
    ; 
+1

你的智慧超出了我最瘋狂的夢想。謝謝! – Ted 2012-04-18 17:45:36

+0

這個想法是,通常*查詢生成器/優化器足夠智能以檢測「循環不變」條件。 (就像'WHERE 1 = 0 OR ...') – wildplasser 2012-04-18 17:54:24

+1

@Ted - 請注意,雖然我做了類似的事情,但SQL並不能像大多數編程語言那樣確保「短路」順序。 wildplasser的評論(通常)是實際發生的事情,這可能會使它出現這種行爲。 – 2012-04-19 16:28:47

1

wildplasser提供的answer是正確的,但也有一些額外的考慮,可能有助於包括。

首先,存儲過程輸入參數可能包含NULL而不是「'。使用COALESCENULLIF功能將涵蓋空和空空間的任何金額:

SELECT ... FROM ... WHERE COALESCE(param1, '') = '' OR myColumn.name = param1 ; 

當這種類型的搜索查詢被編譯成一個存儲過程,它通常有助於對裏面的語句始終啓用REOPT程序。如果不這樣做,存儲過程中的SQL語句將始終使用相同的訪問計劃,而不管在運行時將哪些輸入參數傳遞到存儲過程。允許優化程序在運行時重新評估過程中的每個語句將提供更好的機會在用戶搜索特定列時利用正確的索引。

CALL SYSPROC.REBIND_ROUTINE_PACKAGE 
    ('P','YOURPROCSCHEMA.YOURPROCNAME','REOPT ALWAYS') ; 
0

此處的另一個關鍵詞將是「Dynamic SQL」。建立你的查詢作爲一個字符串,或EXECUTE IMMEDIATE他們(對於UPDATE,INSERT或DDL's)或使用PREPARE/OPEN/FETCH(對於SELECT)。