3

以下不是执行此操作的“正确方法”,而是我要实现的目标的演示:

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。什么是这样做的好方法?

4

3 回答 3

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))
   )
于 2013-01-01T22:31:37.953 回答
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 的答案,这将起作用(我以前使用过他的语法类型)。我希望这确实有效,因为它看起来更优雅 - 你能告诉我它是否有效吗?

于 2013-01-01T22:40:52.773 回答
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

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

于 2013-01-01T22:50:27.453 回答