0

私はSQLにかなり不慣れです。SQLServer2012を使用しています。

基本的に、SQL SELECTステートメントのWHERE句は、ストアドプロシージャに渡される特定のパラメータの値に応じて調整する必要があります。

また、このSELECTの結果をストアドプロシージャ内の別のSELECTステートメントと統合します。

これまでの構造は次のとおりです。

CREATE PROCEDURE dbo.procMyProcedure
  @Param1 smallint = null
  , @Param2 int = null
  , ...
AS ...

--I have three separate SELECT statements, each catering for a specific scenario

    SELECT ...
    FROM ...
    WHERE
        (ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number)) AND 
        (EE.EME_Number = ISNULL(@Param2, EE.EME_Number))

    SELECT ...
    FROM ...
    WHERE
        (EE.EME_Number = ISNULL(@Param2, EE.EME_Number))

    SELECT ...
    FROM ...
    WHERE
        (ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number))

WHERE句を除いて、ステートメントは同じです。私のシナリオでは、最初のステートメントは正確に1つの結果を返します。2番目は119の結果を返します。3番目は3つの結果を返します。

3つのステートメントすべてを実行したくありません。渡された(オプションの)パラメーターの値に応じて、それらを1つのステートメントにマージし、その1つのステートメントが上記の3つのステートメントと同じ結果を返すようにします。

SELECTをネストされたIF...ELSE IF構造でラップすることでこれを行うことができますが、UNIONを使用できません。次の構造は機能しません。

    IF ...
        SELECT ...
    ELSE IF ...
        SELECT ...
    ELSE IF ...
        SELECT ...
UNION
    SELECT ...

UNIONステートメントの一部として使用できるように、これらを単一のSELECTステートメントにマージする方法が必要です。

私は次のことを知りたい:

SELECT ... --This select
UNION
SELECT ... --Other stuff

私はこれでどんな助けにも本当に感謝します。

よろしく、

アダム。

4

2 に答える 2

1

わかった。私は自分の問題の解決策を見つけました。これには、ブール論理とNULLおよびかなりの数の括弧の使用が含まれます。

これが私が探していたWHERE句です:

WHERE
    ((ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number)) AND 
     (EE.EME_Number = ISNULL(@Param2, EE.EME_Number)))
    OR 
    ((ER.EMR_Number = ISNULL(@Param1, NULL)) AND 
     (EE.EME_Number = ISNULL(@Param2, EE.EME_Number)))
    OR
    ((ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number)) AND 
     (EE.EME_Number = ISNULL(@Param2, NULL)))

それは私が期待した正確な結果を私に与えます、そして私はまだUNIONステートメントでクエリを使うことができます。

もちろん、もっとエレガントな解決策があるかもしれません。もしそうなら、投稿してください。

-アダム。

于 2012-09-07T05:56:19.233 に答える
0

emr_numberとeme_numberがnull許容でない場合は、ANDの代わりにORを使用して最初のクエリを実行するだけです。

于 2012-09-06T05:18:33.803 に答える