2017-09-21 7 views
0

私はいくつかのパラメータを含むクエリを持っています。引数の評価に基づいて異なるパラメータで同じクエリを実行する

別のパラメータセットがnullの場合は、1組のパラメータを使用してクエリを実行する必要があります。

条件付きでステートメントを繰り返さずにこれを行う別の方法はありますか?例えば

:上記の方法と別のステートメントの評価句でPROCをprocの中でクエリを入れて呼び出すことから離れて、これを実行する方法は他に

USE MYDataBase; 
GO 

DECLARE @Argument1 VARCHAR = 1234; 
DECLARE @Argument2 VARCHAR = 'HELLO WORLD'; 

IF @Argument1 IS NULL 

SELECT * FROM MyTable 
WHERE ColumnValue = @Argument1 

ELSE 

SELECT * FROM MyTable 
WHERE ColumnValue = @Argument2 

ありますか?

答えて

0

あなたは、COALESCEを使用することができます。

USE MYDataBase; 
GO 

DECLARE @Argument1 VARCHAR = 1234; 
DECLARE @Argument2 VARCHAR = 'HELLO WORLD'; 

SELECT * FROM MyTable 
WHERE ColumnValue = coalesce(@Argument1, @Argument2) 

合体はあなたの最初の非ヌルあなたが提供するパラメータを返します - すべてのパラメータがnullの場合はnullを。

+0

たとえば、次のような場合にこれがどのように機能するかを表示します。申し訳ありませんが、私は例を単純にしておきたいと思いました。例の単純さを考えれば、あなたのアプローチはうまくいくでしょう。 – Altitude

+0

申し訳ありません - 私はあなたが "両サイド"で何を意味するのか分かりません。引数が多い場合は、coalesce(Arg1、Arg2、Arg3、Arg4、...、ArgN)を追加したままにしておきます。 [MSのドキュメント](https://docs.microsoft.com/en-us/sql/t-sql/language-elements/coalesce-transact-sql)を見てください。 – Brett

0

5つ以上の可能性のように、本当に複雑になるときは、一般的に動的ステートメントを使用します。

create Table DynamicExample (DynamicExampleId int identity, Dsc varchar(32), Memo varchar(512), Memo2 varchar(512)) 
insert into DynamicExample values ('test', 'Memo', 'Memo2'),('test2', 'Memo 2', 'Memo2 2') 

Declare @SQL Nvarchar(512) = 'select * from DynamicExample' 

Declare @param nvarchar (128) = ' where {column} = {value}' 
declare @column nvarchar(64) = 'DynamicExampleId' 
declare @value nvarchar(64) = '2' 

Select @param = Replace(@param, '{column}', @column); 
Select @param = Replace(@param, '{value}', @value); 

Select @SQL += @param 

exec sp_executesql @SQL 

は、この方法の利点は、あなたがこれをやっていないされています

あれば、そうでない場合など、それ以外の、あれば、そうでない場合など、それ以外の、あれば、そうでない場合など、それ以外の、などあなたがいます文字通り言っている: "私は述語を持っている場合は、彼らが何であるか、その価値を判断する。これは、複数の述語がある場合、最初の述語か最初の述語かを確認するために簡単に検査を拡張し、 'where'の代わりに 'and'を使用してさらに拡張することができます。

関連する問題