如果我的存储过程的两个参数都不为空,请填充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
。
答案 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)
如果此答案不起作用(如果其他任何一个不起作用),请发布整个查询。我的答案是对你的要求的最佳猜测,对其他人来说也是如此。