0

@p呼び出されたときにストアドプロシージャに渡されるパラメーターに基づいて、SQLServerでステートメントを実行したいと思います。

@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))

ただし、残念ながらSQLServerはペアワイズ比較をサポートしていません。

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 に答える