使用CASE for WHERE字段IN

时间:2013-01-01 22:26:53

标签: sql case where

以下不是“正确的方法”,而是我正在努力实现的目标:

SELECT
   [...]
FROM
   [...]
WHERE condition1 
  AND condition2 
  AND field IN CASE (@type)
                 WHEN 1 THEN (SELECT subquery #1)
                 WHEN 2 THEN (SELECT subquery #2)
                 WHEN 3 THEN (SELECT subquery #3)
               END

意思是,我希望为参数@type的每个不同值提供不同的子查询。 什么是一个好方法呢?

3 个答案:

答案 0 :(得分:7)

试试这个

SELECT
   [...]
FROM
   [...]
WHERE
   condition1 AND condition2 AND 
   ((@type = 1 and field IN (SELECT subquery #1))
    OR (@type = 2 and field IN (SELECT subquery #2))
    OR (@type = 3 and field IN (SELECT subquery #3))
   )

答案 1 :(得分:1)

好主意,但你必须像这样拆分测试:

试试这个:

SELECT
   [...]
FROM
  [...]
WHERE condition1 
  AND condition2 
  AND CASE (@type)
        WHEN 1 THEN (field in (SELECT subquery #1))
        WHEN 2 THEN (field in (SELECT subquery #2))
        WHEN 3 THEN (field in (SELECT subquery #3))
    END

我之前从未尝试过这种语法,所以如果它不起作用,请使用rs的答案,这将起作用(之前我使用过他的语法类型)。我希望这确实有效,因为它看起来更优雅 - 如果有效,你能让我知道吗?

答案 2 :(得分:0)

很难说出你要做什么,但考虑到提供的示例,三个“子查询”中的每一个都返回一些值,该值与IN子句中的其他值进行比较。我会调查使用INNER JOIN代替:

SELECT
   [...]
FROM
   [...]

INNER JOIN (
   SELECT CASE WHEN @type = 1 THEN somefield
               WHEN @type = 2 THEN somefield
               WHEN @type = 3 THEN somefield
               END AS inner_field
   FROM [....]
   ) XTRA
ON XTRA.inner_field=field

WHERE
   condition1 AND condition2

当然,这只是一个例子;您需要一个与您的数据匹配的版本。您是否真的需要三个单独的子查询,这在很大程度上取决于他们在做什么。关键是使用JOIN,大多数数据库都处理得很好。