以下不是“正确的方法”,而是我正在努力实现的目标:
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
的每个不同值提供不同的子查询。
什么是一个好方法呢?
答案 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
,大多数数据库都处理得很好。