sql server 使用 where 和 if else 条件
Posted
技术标签:
【中文标题】sql server 使用 where 和 if else 条件【英文标题】:sql server using where with if else condition 【发布时间】:2014-02-09 22:23:28 【问题描述】:我有一个存储过程,它接收可能是男性、女性或两者的性别值,我需要能够调节我的 where 子句,以便如果 @gender 值是“两者”,那么选择应该返回男性和女性,但如果性别是男性或女性,则应选择 @gender 值。我试过下面的查询,它给出了不正确的语法错误。
选择 名字,第二名,性别,种族,身高,身高单位,体重,体重单位,电子邮件添加 来自志愿者
IF @gender = 'both'
BEGIN
WHERE Gender = 'male' or Gender ='female'
END ELSE BEGIN
WHERE Gender = @gender
END
【问题讨论】:
我没有得到Male%中使用的通配符...据我所知只有男性或女性两种性别... 你不能把 IF 语句放在这样的 WHERE 子句中......要么使用动态 SQL,这将是一种矫枉过正,要么使用 case。 【参考方案1】:您不能使用if
来设置有条件的where
子句。相反,只需将逻辑放在查询中:
基于 OP,你想要:
select FirstName, SecondName, Gender, race, Height, HeightUnit,
Weight, WeightUnit, EmailAdd
from volunteers
where @gender = 'both' and gender in ('male', 'female') or
gender = @gender;
或者,这可能就足够了:
select FirstName, SecondName, Gender, race, Height, HeightUnit,
Weight, WeightUnit, EmailAdd
from volunteers
where @gender = 'both' or
gender = @gender;
【讨论】:
【参考方案2】:好的,如果我理解正确的话……试试这个方法:
select FirstName,SecondName,
CASE When @Gender = 'both' then 'Male, Female' else @Gender as Gender END
,race,Height,HeightUnit, Weight,WeightUnit,EmailAdd from volunteers
你可以精确地调整你想要它说的内容,但这就是想法
更新:根据 cmets,这是他正在使用的完整程序:
Create PROCEDURE spSelectUpdateTrial
@gender nvarchar(50),
@minage nvarchar(150),
@maxage nvarchar(150),
@country nvarchar(50),
@smoking nvarchar (50),
@smoke nvarchar(50),
@nct nvarchar(50) AS
select FirstName,
SecondName,
CASE
When @Gender = 'both'
then 'Male, Female'
else @Gender
END
as
Gender,
race,
Height,
HeightUnit,
Weight,
WeightUnit,
EmailAdd
from volunteers
注意我在else @gender
之后添加了一个END
【讨论】:
是的,ATgender 是 sp 的参数,我已用于代码,但在“作为性别”附近出现错误 Create PROCEDURE spSelectUpdateTrial ATgender nvarchar(50)、ATminage nvarchar(150)、ATmaxage nvarchar(150 ), ATcountry nvarchar(50), ATSmoking nvarchar (50), ATsmoke nvarchar(50), ATnct nvarchar(50) AS 选择 FirstName,SecondName,CASE 当 ATGender = 'both' 然后 'Male, Female' 否则 ATGender 作为 Gender,race ,Height,HeightUnit,Weight,WeightUnit,EmailAdd from 志愿者 你失踪了,在@Gender之后END 我添加了 end 可以成功运行查询,唯一的事情是如果 'both' 作为 ATGender 传递,那么我希望同时显示男性和女性行。但是,使用您的代码,性别列包含男性,每一行的女性应该像第一行 - - - 男性 - 第 2 行 - - - 女性 - 第 3 行 - - - 男性 - 等等 我不清楚,但戈登的方法似乎成功了以上是关于sql server 使用 where 和 if else 条件的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:IF .. ELSE 中的 Where 子句
在 SQL Server 存储过程的 where 中使用参数作为列
ms sql server中where子句中的if else条件
SQL Server存储过程:if variable = X,case where statement