2

目标

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.

4

3 回答 3

1

似乎您真的只想使用 or 语句。

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.
)
于 2013-08-16T15:23:42.673 回答
1

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

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

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

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

如果这个答案不起作用(并且如果其他任何一个不起作用),请发布整个查询。我的回答是对您要求的最佳猜测,其他人可能也是如此。

于 2013-08-16T15:26:50.907 回答
1

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

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

相信会有你想要的效果。唯一的问题是您的故障模式(均为空;均非空)情况,以及如何扭曲逻辑以使它们按您想要的方式工作。

于 2013-08-16T15:16:42.840 回答