0

我想根据在调用@p存储过程时传递给我的存储过程的参数在 SQL Server 中执行一条语句。

如果@p值为 1,[a]则不过滤 table 中的数据,如果@p值为 0,则根据 table[a]上的数据过滤table 中的数据[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

但是,它使我的存储过程太长了。有另一种解决方法吗?

4

2 回答 2

2

可能最简单的方法是使用 EXISTS 语法:

SELECT columnlist
FROM a
WHERE @p=1 OR EXISTS (SELECT * FROM b WHERE a.col1=b.col1 AND a.col2=b.col2)
于 2012-12-26T05:55:51.950 回答
1

可以使用 EXISTS 像这样重写它:

SELECT
*
FROM
a
WHERE
(@p = 1) or EXISTS(SELECT 1 FROM b where b.col1=a.col1 and b.col2=a.col2)
于 2012-12-26T16:19:38.400 回答