我需要在SQL查询中匹配一些特定于性别的数据,并且在使where子句逻辑正确时遇到了一些困难。 我正在尝试使用一个case语句,但是被卡住了……也许case语句不是执行此操作的最佳方法,如果是这样,任何可行的替代方法都将不胜感激。

首先,我有一个本地变量@gender。 它可以是“ male”,“ female”或null。

我从中提取数据的表中有一列名为“性别”的列,其中包含三个值之一,但永远不会为null:“ male”,“ female”或“任一”。

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

如果局部变量是“ female”,那么我想检索性别值为“ female”或“任一”的任何记录。

如果局部变量为null,那么无论性别值是多少,我都想检索记录,因此这三个都是“男性”,“女性”或“两个”。

到目前为止,这是我尝试过的操作,但不确定如何进行:

 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

===============>>#1 票数: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)

WHERE clause 1=1条件始终评估为true,实际上是一种忽略WHERE语句的技巧,因此如果@gender传递为NULL则返回包含性别'Male','Female'或'Either'的表的所有行,即所有返回的所有行,无论性别

===============>>#2 票数:1

不知道为什么要使用大小写转换。 您的数据库区分大小写吗?

尝试这个

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

===============>>#3 票数:0

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

  ask by optionsix translate from so

未解决问题?本站智能推荐: