2011-10-13 51 views
1

我有一個有點複雜的MySQL查詢我試圖執行。我有兩個參數:facility和isEnabled。設施可以具有「全部」的值或者是特定的ID。 isEnabled可以具有「ALL」的值或0/1。複雜的MySQL查詢問題

我的問題是,我需要拿出可以處理以下情形的邏輯: 1)基金= ALL和的IsEnabled = ALL 2)基金= ALL和的IsEnabled =值 3)基金= someID AND的IsEnabled = ALL 4)設施= someID AND的IsEnabled =值

的問題是,我有幾個嵌套的IF語句:

IF (Facility = 'ALL') THEN 
    IF (isEnabled = 'ALL') THEN 
    SELECT * FROM myTable 
    ELSE 
    SELECT * FROM myTable 
    WHERE isEnabled = value 
    END IF; 
ELSE 
    IF (isEnabled = 'ALL') THEN 
    SELECT * FROM myTable 
    WHERE facility = someID 
    ELSE 
    SELECT * FROM myTable 
    WHERE facility = someID AND isEnabled = value 
    END IF; 
END IF; 

我想能夠將邏輯使用任一WHERE子句中結合CASE聲明或有條件的(AND/OR),但今天早上我有困難纏繞它。目前查詢未按預期執行。

任何見解都會有所幫助! 感謝

+0

你可以只是把這種邏輯在'WHERE'條款,並使用括號...... –

回答

2

你可以這樣做......

SELECT 
    * 
FROM 
    myTable 
WHERE 
    1=1 
    AND (facility = someID OR Facility = 'ALL') 
    AND (isEnabled = value OR isEnabled = 'ALL') 

然而,這會產生不良的執行計劃 - 它試圖找到一個放之四海而皆準,但參數的每個組合可以根據數據的不同計劃,索引等

這意味着它是更好地建立動態

SELECT 
    * 
FROM 
    myTable 
WHERE 
    1=1 
    AND facility = someID -- Only include this line if : Facility = 'ALL' 
    AND isEnabled = value -- Only include this line if : isEnabled = 'ALL' 

我知道它可以覺得髒到u查詢它是動態的查詢,但是這對於什麼時候真正能夠勝出是一個很好的例子。我現在會爲你找到一個非常有用的信息鏈接。 (這是一個很大讀,但它是非常值得借鑑)

鏈接:Dynamic Search

+0

+1有關的執行表現不佳重新'OR'可選模式 – StuartLC

+0

我想我應該提及這是來自存儲過程,我實際上減少了領域。實際上在SELECT語句中有187列(不是SELECT * FROM)。通過該鏈接閱讀並且好像它建議整個查詢在SP中構建。從代碼傳遞187個字段將需要一些主要的編程更改..不知道如果這是可管理的。除非我看到錯誤的東西? – Encryption

+0

這是一款交易和平衡遊戲。如果您有條件*有時會*在WHERE子句中,以這種方式動態構建它可以產生顯着的好處。就SELECT語句而言,好處要小得多,儘管您可能仍然可以根據您在WHERE子句中選擇的參數進行一些優化。如果您有187個可搜索字段,並且有187個可能的WHERE子句條目,那麼您以任何方式查看187個參數,對嗎? – MatBailie