我想创建如下语句:
if (select statement1 returns rows){
select statement2
}
else {
select statement3
}
此if
语句是更大查询的一部分
select from products where p.id in (
if (select statement1 returns rows){
select statement2
}
else {
select statement3
}
这在SQL Server中是否可行,或者我的想法不正确?
答案 0 :(得分:3)
您需要结合使用EXISTS
和CASE..END
:
select *
from products
where p.id in (
case when (exists ( <statement1> ))
then ( <statement2> )
else ( <statement3> )
end
)
<statement1>
可能是:SELECT * FROM Customer WHERE Id = 123
<statement2>
可能是:SELECT MIN(field) FROM someTable
<statement3>
可能是:SELECT 0 as DefaultValue
如果您能够展示一些您希望这些实际陈述的例子,我可以提供更具体的答案。
答案 1 :(得分:1)
实际上,由于性能方面的考虑,SQL更加严格。您的查询将更像这样:
select *
from products
where 1 = case when (exists ( <statement1> ))
then case when p.id in ( <statement2> ) then 1 else 0 end
else case when p.id in ( <statement3> ) then 1 else 0 end
end
答案 2 :(得分:1)
由于您要检查相同的id
存在,我认为您可以在此处UNION
。
select *
from products
where p.id in (select id from table1
union
select id from table2)
答案 3 :(得分:1)
我建议在两个条件之间使用UNION以帮助避免性能问题......也可能更容易阅读。
SELECT FROM products p
WHERE EXISTS (SELECT STATEMENT1)
AND EXISTS (SELECT STATEMENT2 s2 WHERE s2.p_id = p.id)
UNION
SELECT FROM products p
WHERE NOT EXISTS (SELECT STATEMENT1)
AND EXISTS (SELECT STATEMENT3 s3 WHERE s3.p_id = p.id)
根据陈述的性质,您可以在第二次选择中取消不存在。