2016-09-18 80 views
0

因此,我在我的應用程序中實現了搜索功能,並且我需要編寫SQL查詢來根據各種可能的參數在數據庫中搜索記錄。我包括樣本是我到目前爲止有:如何使用各種參數創建SQL搜索查詢

SELECT m.*, a.*, p.*, e.* 
FROM members m 
    LEFT JOIN addresses a ON m.member_id = a.address_member_id AND a.preferred_address = TRUE 
    LEFT JOIN phones p ON m.member_id = p.phone_member_id AND p.preferred_phone = TRUE 
    LEFT JOIN emails e ON m.member_id = e.email_member_id AND e.preferred_email = TRUE 
WHERE m.member_id IN (
    (SELECT address_member_id 
    FROM addresses 
    WHERE address = '123 Hart Ct' AND unit = NULL AND city = 'Hometown' AND state = 'NJ' AND zip_code = '08895'), 
    (SELECT phone_member_id 
    FROM phones 
    WHERE area_code = '732' AND prefix = '619' AND line_number = '7826'), 
    (SELECT email_member_id 
    FROM emails 
    WHERE email_address = '[email protected]') 
) 
AND m.first_name = 'Jane' AND m.middle_name = 'Deborah' AND m.last_name = 'Foster' 
ORDER BY member_id ASC; 

正如你所看到的,我在基於該表中的值「成員」表中搜索記錄,以及價值觀與之相關聯的「首選」地址,電話,電子郵件等。

問題是上面的查詢需要提供所有這些值。在大多數情況下,用戶只會提供少數實際值來執行搜索。

現在,我知道一個選擇是在我的應用程序層中動態構建查詢,並將字符串連接在一起,而不是什麼。這樣,WHERE子句將只具有該特定查詢所需的值。但在我這樣做之前,我想知道是否有任何方法可以以純SQL方式完成此任務?

我使用MYSQL btw。謝謝。

+0

如果您通過hibernate或其他框架調用查詢 - 您有基於v添加條件的約束選項Alue通過。如果你直接從你的應用程序連接到數據庫,那麼我知道的方法是手動追加你的查詢字符串! – Pat

回答

0

你有兩個選擇這樣做純粹-SQL的方式

  1. 的第一種方法是使用存儲過程。使用它,你可以使用IF狀態並連接所有的存儲過程中的查詢字符串,然後執行它

  2. 第二種方法是使用OR條件

    SELECT m.*, a.*, p.*, e.* 
    FROM members m 
    LEFT JOIN addresses a ON m.member_id = a.address_member_id 
             AND a.preferred_address = TRUE 
    LEFT JOIN phones p ON m.member_id = p.phone_member_id 
            AND p.preferred_phone = TRUE 
    LEFT JOIN emails e ON m.member_id = e.email_member_id 
            AND e.preferred_email = TRUE 
    WHERE m.member_id IN ((SELECT address_member_id 
             FROM addresses 
             WHERE ('123 Hart Ct' is NULL OR address = '123 Hart Ct') 
             AND (NULL is NULL OR unit = NULL) 
             AND ('Hometown' is NULL OR city = 'Hometown') 
             AND ('NJ' is NULL OR state = 'NJ') 
             AND ('08895' IS NULL OR zip_code = '08895')); 
    
(我可以提供一個演示,如果你想)

注意,如果變量將爲空,則可以用NULL替換NULL NULL