where子句中包含的sql case语句 - 条件逻辑

时间:2014-04-21 04:08:53

标签: sql sql-server tsql

我需要在SQL查询中匹配一些性别特定的数据,并且在使where子句逻辑正确方面遇到一些困难。我试图使用一个案例陈述,但我被卡住了......也许案例陈述不是最好的方法,如果是这样,任何可行的替代方案都将受到赞赏。

首先,我有一个局部变量@gender。它将是“男性”,“女性”或“无效”。

我从中提取数据的表格中有一个名为gender的列,其中包含三个值中的一个,但永远不会为null:' male',' female'或者&# 39;或者'

逻辑很简单。如果本地变量是“男性”,那么我想要检索性别值为“男性”的任何记录。或者'要么'。

如果本地变量是“女性”,那么我想要检索性别值为“女性”的任何记录。或者'要么'。

如果局部变量为空,那么我想要检索记录,无论性别值是什么,所以所有三个,男性,女性'或者'要么。

以下是我迄今为止所尝试的内容,而且我不确定如何继续:

 select x from y
    where UPPER(d.Gender) =
        case when upper(@gender) = 'MALE' then 'MALE' 
        when upper(@gender) = 'FEMALE' then 'FEMALE'
        when @gender is null then 'EITHER'
     end

3 个答案:

答案 0 :(得分:2)

select x from y
    where (( UPPER(d.Gender) = UPPER(@gender) OR  UPPER(d.Gender) ='EITHER') 
               AND @gender IS NOT NULL ) 
          OR (@gender IS NULL AND 1=1)
1=1中的

WHERE clause条件总是求值为true,并且基本上忽略了WHERE语句,所以如果@gender传递NULL,那么包含所有行的表性别'男性' ,'女性'或者'返回' ,即返回所有行而不考虑性别

答案 1 :(得分:1)

不确定您使用案例转换的原因。您的数据库是否区分大小写?

试试这个

select x from y
    where UPPER(d.Gender) = upper(@gender) 
    OR UPPER(d.Gender) = UPPER(isnull(@gender,'EITHER'))

答案 2 :(得分:0)

select x from y
 where UPPER(customer_type) in 
       ('EITHER', decode(@gender, null, 'FEMALE', @gender),
        decode(@gender, null, 'MALE',  @gender)
       );