2012-12-26 59 views
0

我想在SQL Server中执行一个基于参数@p的语句,该语句在被调用时传入我的存储过程。成对比较

如果@p具有值1,那么从表[a]数据没有被过滤,如果@p具有值0,则来自表[a]数据基于表[b]数据进行过滤。但数据必须使用配对比较进行比较。

如果SQL Server支持两两比较,我可以通过使用此语法

SELECT 
    * 
FROM 
    a 
WHERE 
    (@p = 1) or ((a.col1, a.col2) in (SELECT col1, col2 FROM b)) 

但不幸的是SQL Server不支持两两比较做到这一点。

我也可以通过使用if语句来做到这一点。

if(@p=1) 
begin 
    SELECT 
     * 
    FROM 
     a 
end 
else 
begin 
    SELECT 
     * 
    FROM 
     a join b on a.col1=b.col1 and a.col2=b.col2 
end 

但是,它使我的存储过程太长。是否有另一种解决方法来做到这一点?

回答

2

也许最简单的方法是与EXISTS语法:

SELECT columnlist 
FROM a 
WHERE @p=1 OR EXISTS (SELECT * FROM b WHERE a.col1=b.col1 AND a.col2=b.col2) 
1

它可以通过改写这样EXISTS:

SELECT 
* 
FROM 
a 
WHERE 
(@p = 1) or EXISTS(SELECT 1 FROM b where b.col1=a.col1 and b.col2=a.col2)