2011-12-23 12 views
1

我有一個工作解決方案,但我想知道是否有更好的方法來獲得相同的結果。按給定參數過濾查詢或空白如果沒有提供

場景:

用戶界面解析爲一個GUID搜索過濾器。因此,如果他們想要搜索與客戶John Doe相關的所有記錄,他們將輸入John Doe,並在執行最終查詢之前將John Doe解析爲John Doe的customer_id。因此,如果CUSTOMER_ID爲XYZ-456,查詢將是:

SELECT id AS item_id FROM items WHERE items.customer_id = 'XYZ-456'; 

這將返回該項目的ID,然後將其轉至其他流程爲用戶提供全面的搜索結果的用戶。

但顯然用戶可能根本沒有選擇過濾器。而不是插入整個WHERE參數,我已經用以下解決方案:

SELECT id AS item_id FROM items WHERE items.customer_id LIKE '%$customer_id%'; 

所以,如果沒有給出,它解析爲:

SELECT id AS item_id FROM items WHERE items.customer_id LIKE '%%'; 

將返回所有(期望的結果)。

真的,這工作正常,但從技術上講,它們始終是以下customer_ids ,EXYZ-4567的理論問題,其中兩個ID中較短的一個將爲customer_id返回項目。那麼有沒有一種「正確」的方式來說「返回所有結果where field ='X',但是如果'X'是空白,返回所有內容而不是什麼?

+0

只知道:有任何理由,你爲什麼不帶編程語言做到這一點? – 2011-12-23 20:18:20

+0

做哪部分?用條件語句寫出子句?因爲我更願意儘可能減少代碼,數據庫或編程。基本上,我使用YEAR()這樣的MySQL函數,而不是派生出代碼中的年份並將其傳入,原因與此相同。因爲數據庫可以這樣做,並且因爲我知道是否出現問題,所以使用的是查詢,而不是使用php和mysql不相處。 – Anthony 2011-12-24 03:07:39

回答

2
where items.customer_id = '$customer_id' or '$customer_id' = '' 

這樣的邏輯也適用於多個可選條件過濾。

編輯 - 類似的方式

where '$customer_id' in (items.customer_id, '') 
+0

很好。空白等於空白。讓我試試看。 – Anthony 2011-12-24 03:15:06

+0

完美。這非常簡單,但是我需要創造性的解決方案。謝謝。 – Anthony 2011-12-24 03:18:42

+0

哈哈,不錯:) – 2011-12-24 08:54:41

1

只是爲了理論上的樂趣,因爲我肯定會在PHP中解決這個問題。

SELECT id AS item_id FROM items WHERE items.customer_id LIKE IF("$customer_id" = "", "%%", "$customer_id"); 

不知道這是否有效,但我很好奇。

+0

+1對於拋出一個未經檢驗的想法,工作。因爲他不需要使用函數(因此應該更可靠),所以我會用克里斯的答案,但是你的想法是可靠的,我很驚訝它甚至沒有跨過我的想法。謝謝。 – Anthony 2011-12-24 03:21:07

相關問題