两个参数都不为空的地方

时间:2013-08-16 15:13:11

标签: mysql sql

目标

如果我的存储过程的两个参数都不为空,请填充Where子句。

问题

查看以下查询片段:

If(userEmail Is Not Null Or userMarketId Is Not Null)
    Where 
        Then
        Case When 
            userEmail = '' 
        Then user.MarketId = userMarketId
        Else user.Email = userEmail
        End = 1
End If;

语法错误 - 只是为了说明 - 但上下文正是我在想的。

我能做些什么才能达到目标,伙计们?我的意思是,执行我想做的事情的正确语法是什么?

场景

好吧,似乎有些事情在这里并不清楚,我会再解释一下。

  

如果程序的第一个参数(userEmail)已填写,那么我的Where子句将基于userEmail

     

如果程序的第二个参数(userMarketId)已填写,那么我的Where子句将基于userMarketId

     

如果我的两个参数都为空,那么就没有Where子句。

     

(两个参数都不会发生)

换句话说,或一个参数,或另一个,或没有。

情况

此过程称为getUsers。如果用户对应用程序执行身份验证并且它检索用户的信息,则调用它。

如果用户是管理员,则他可以访问在应用程序上注册的用户列表。要获取此用户列表,我使用相同的查询,因为我想要获取的列与单个用户相同。

要分离查询提案,我认为我需要使用Case / If来“播放”(存储过程的)参数。

代码聚光灯

遵循完整的存储过程:

BEGIN
   Select user.Id as userId, 
               userPersonal.Firstname as userFirstname, 
               userPersonal.Lastname as userLastname
    From app_users as user
    If(userEmail Is Not Null Or userMarketId Is Not Null)
        Where 
            Then
            Case When 
                userEmail = '' 
            Then user.MarketId = userMarketId
            Else user.Email = userEmail
            End = 1
    End If;
END

技术细节

我正在使用MySQL

3 个答案:

答案 0 :(得分:1)

我认为你可以通过操作员短路来做到这一点:

WHERE (userEmail IS NOT NULL AND user.Email=userEmail) OR (userMarketID IS NOT NULL AND user.MarketID = userMarketId)

我相信会有你想要的效果。唯一的问题是你的失败模式(都是null;两者都不为空)的情况,以及如何扭曲逻辑以使它们以你想要的方式工作。

答案 1 :(得分:1)

好像你真的只想使用或声明。

where 
(
   (userEmail is null and userMarketID=user.marketID) OR --Handles when useremail is blank
   (userMarketID is null and userEmail = user.email) OR --handles when usermarketID is blank
   (useremail is not null and usermarketID is not null and user.email=useremail) --Handles when neither are blank
  --example doesn't illustrate a need for a where when both are blank.
)

答案 2 :(得分:1)

看起来您想按如下方式过滤行:

  • 如果userEmail参数有值(不为空/空),请按user.Email进行过滤。
  • 如果userEmail 为空/空但userMarketId不是user.MarketId则过滤。

如果是这种情况,这应该有效:

WHERE (COALESCE(userEmail, '') <> '' AND user.Email = userEmail)
   OR (COALESCE(userMarketID, '') <> '' AND user.MarketId = userMarketId)

如果此答案不起作用(如果其他任何一个不起作用),请发布整个查询。我的答案是对你的要求的最佳猜测,对其他人来说也是如此。