我需要在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
答案 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)
);