带有搜索Web应用程序可选字段的SQL查询

时间:2015-06-29 05:33:43

标签: java mysql sql spring spring-mvc

不是SQL专家:

我目前正在实施搜索网络应用程序。用户会将GET request发送给特定的Endpoint

Endpoint将接受一组URL Params,请求可以带有可选字段。如1,2或3个字段。

USER的我的数据库表看起来像这样。

+--------------+---------+------+-----+---------+----------------+
| id        | firstName    | lastName | email | zip | phone      |
+--------------+---------+------+-----+---------+----------------+

现在,网络应用程序将GET RequestPhoneZip获得Email

我有两个解决方案可以做到这一点但看起来都很糟糕:

Solution 1:
  1. 根据我收到的网址参数,有多个SQL QueriesExecute

    Select * from User where phone=1111111111 and zip=12345 and email=test@email.com;

    Select * from User where phone=1111111111 and zip=12345;

    ... ...

  2. 等等........我最终会遇到很多疑问,这将是一个糟糕的实现。也很难维护。

    Solution 2:
    

    我想到的其他解决方案是有一个方法,它将根据我收到的URL Params构建一个SQL查询。

    示例:

    buildSQLQuery(phone,zip,email){
    
    String sql = "Select * from User where "
    
    if(phone!=null  && email!=null && zip!=null ){
    sql = sql   + "phone = " + phone + " and zip = " + zip + " and email = " + email;
    }else if (phone!=null  && email!=null && zip==null){
    sql = sql + "phone = " + phone + " and email = " + email;
    }
    .......
    ......
    And so on have all conditions and build that particular query.
    }
    

    我不喜欢这两种解决方案。

    有没有办法编写单个SQL查询,并且可以处理上述所有条件。

    如果网址参数值为NULL,那么这应该不会影响查询,我会得到预期的结果。

    在我的情况下,未进入的可选值设置为NULL

    我可以实现这样的东西吗?

    Select * from User where (if notNull (phone))(phone = phone ) and (if notNull (email))(email = email ) and (if notNull (zip))(zip = zip )
    

    如果上述任何一个值为null,则不要在where Condition中使用该部分。

    此外,我将始终存在一个字段,因此不存在所有值都为空的情况。

    我在Java和Spring MVC中实现这个Web应用程序。如果有人能指导我正确的方向。

    谢谢。

2 个答案:

答案 0 :(得分:1)

我认为还有一个可能的解决方案:

String sql = "Select * from User where 1=1 "

    if(phone!=null){
    sql +=  " and phone = " + phone ;}

    if(email!=null){
    sql +=  " and email = " + email ;}

    if(zip!=null){
    sql +=  " and zip = " + zip ;}

或者您可以尝试以下单个查询:

select * from User 
where (@phone is null OR phone = @phone) AND (@email is null OR email = @email) AND (@zip is null OR zip = @zip)

答案 1 :(得分:0)

你可以这样做:

SELECT * FROM User where(
   IF($phone != 0, IF(phone = $phone,1,0), 0) AND 
   IF($email != 0, IF(email = $email,1,0),0) AND 
   IF($zip != 0, IF(zip = $zip,1,0),0)
)

假设PHP可以更改语法,可能是这个查询没有完全完成工作但是如果你提供小提琴我将修改它以给出正确的结果。