成对比较

时间:2012-12-26 02:06:35

标签: sql-server-2008

我想在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 个答案:

答案 0 :(得分: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 :(得分:1)

可以使用EXISTS这样重写:

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