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

简述SELECT语句中的FROM、WHERE以及ORDER BY子句的作用。SQL Server

where 子句中的 case 语句 - SQL Server