2016-09-18 40 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