使用IN子句在WHERE表达式中的CASE

时间:2013-09-08 18:35:36

标签: sql oracle case

当var1等于' Y'查询显示表格的结果,其中列=' Y'但是当var1 =' N'结果应该是包含' Y'和' N' 我需要把它放在where子句中,因为我使用的是oracle表单。 我试过这种方式,但查询没有显示任何结果:

SELECT  *
FROM    table
WHERE   column1 IN ((CASE WHEN var1 = 'Y' THEN q'[('Y')]'
                                  ELSE TO_CHAR(q'[('Y','N')]')
                                  END))
你能帮帮我吗?谢谢。

1 个答案:

答案 0 :(得分:2)

此处不需要CASE逻辑,因为您可以将其放入具有布尔逻辑的常规WHERE子句中,将(var1 = 'Y', var1 <> 'Y')组中的每个条件()包装起来

SELECT *
FROM table
WHERE
  (var1 = 'Y' AND column1 = 'Y')
  OR (var1 <> 'Y' AND column1 IN ('Y','N'))

注意,我在这里使用var1 <> 'Y'来模拟您的ELSE案例,但如果它只有两个可能的值Y/N,您可以使用var1 = 'N'来表示清晰。

WHERE
  (var1 = 'Y' AND column1 = 'Y')
  OR (var1 = 'N' AND column1 IN ('Y','N'))

实际上,如果Y/Ncolumn1的唯一可能值,那么它可以简化为:

WHERE
  (var1 = 'Y' AND column1 = 'Y')
  -- Returns all rows for column1 if Y,N are the only possible values
  -- No need to explicitly filter it
  OR (var1 <> 'Y')