2017-08-17 80 views
-2

我有其在web應用程序通過用戶接口動態生成的查詢。用戶可以在創建自定義報告時選擇任意數量的過濾器,然後將其轉換爲SQL語句中的「Where」子句。多「OR」 WHERE子句中具有重複的默認條件

這些過濾器可以彼此與「與」或「或」條件來連接。 這可能導致在where子句中,如下所示:

SELECT 
    ... 
FROM 
    company c, 
    INNER JOIN team t, 
    INNER JOIN user u, 
    ... 
WHERE (c.trashed = 0) 
    AND (t.trashed = 0) 
    AND (u.trashed = 0) 
    AND (opp.fee_total_value = 10000) 
    OR (opp.fee_total_value > 5000) 
    --AND (c.trashed = 0) 
    --AND (t.trashed = 0) 
    --AND (u.trashed = 0) 
    AND (opp.fee_total_value < 6000) 
    OR (opp.fee_total_value > 8000) 
    --AND (c.trashed = 0) 
    --AND (t.trashed = 0) 
    --AND (u.trashed = 0) 
    AND (opp.fee_total_value < 9000) 
ORDER BY ... 

不管的「或」,「與」條件的數目我有3個默認的檢查開始,然後添加每一個新的「OR」子句之後。這些是邏輯上刪除的記錄條件 - .trashed = 0

我正在尋找一種方式來做到這一點沒有每一個新的「或」用戶請求後重覆上述3「看不上」檢查。換句話說,我想找到一種方法來排除我在代碼示例中註釋過的行。

+2

您需要向我們展示你的代碼....難道我們只是爲了猜測它是如何產生的?我不認爲你甚至需要做到這一點的SQL將優化的多餘檢查出來,你爲什麼要擺脫他們?附:這聞起來可能會導致SQL注入攻擊,你有沒有考慮過這個?你也應該有你的周圍AND和OR塊... – Milney

+0

請張貼一些示例數據支架和預期的O/P。 –

回答

0

我覺得你是這樣的 -

WHERE (c.trashed = 0) 
AND (t.trashed = 0) 
AND (u.trashed = 0) 
AND (opp.fee_total_value = 10000 OR opp.fee_total_value > 5000) 
AND (opp.fee_total_value < 6000 OR opp.fee_total_value > 8000) 
AND (opp.fee_total_value < 9000) 
ORDER BY ... 

但我不認爲這個你所能實現你的結果。