2017-09-07 14 views
0

WHERE句をこの擬似SQLでどのように書き直しますか?WHERE句のSQL If-Elseとカラム値に基づく条件

SELECT * 
FROM MyTable 
WHERE IF (Col1 <> '') Col1 = @Val1 
     ELSEIF (Col2 <> '') Col2 = @Val2 
+0

このようにIFを使用することはできません。 IFはフローを制御するためのステートメントです。スカラー値を返すために使用されるCASEのような式が必要です。 –

+2

あなたのロジックは何か(普通英語)? – Eli

+0

それは正しい@SeanLangeです。だから私はそれを "擬似SQL"と呼んでいます:) –

答えて

4

あなたの擬似コードの正しい同等です:

WHERE (Col1 <> '' AND Col1 = @Val1) OR 
     (Col1 = '' AND Col2 <> '' AND Col2 = @Val2) 

これはCol2Col1してからの最初の、優先順位に一致します。 Col1が空の文字列の場合は、Col2に移動します。

注:このバージョンでは、Col1NULLではないことが前提です。 NULLの値をサポートする必要がある場合は、ロジックに簡単に組み込むことができます。

+0

ありがとう、これはまさに正しいです。 2番目のORブロックに追加のチェックを追加して、Col1 = ''かどうかを確認する必要がありました。それ以外の場合は前のブロックが優先されます。 –

-1

私はあなたのロジックを正しく理解していると仮定します。 col1 = @ val1またはcol1に一致する空白文字列 OR col2 = @ val2またはcol2は空の文字列です。

SELECT * 
FROM MyTable 
WHERE (Col1 = @Val1 OR Col1 = '') 
OR (Col2 = @Val2 OR Col2 = '') 
+0

これは実際に私のコードの正しい解釈ではないので、この場合はうまくいかないでしょう。 –

0

まあ、CASE関数を使用して、このような何かを行うことが可能です:

SELECT * 
FROM MyTable 
WHERE 1 = CASE WHEN Col1 <> '' THEN CASE WHEN Col1 = @Val1 THEN 1 END 
       WHEN Col2 <> '' THEN CASE WHEN Col2 = @Val2 THEN 1 END 
      END 

ケース関数は値を返します。したがって、1 = 1の場合、条件が満たされます。ケースのELSE部分は除外されているため、条件が満たされない場合はNULLが返されます。 1 = nullは決して真ではないため、WHERE条件は満たされません。追加ELSEパーツ: - 時には、このようなコードが追加した余分な複雑さが保証されていない

それはなど

EDITパフォーマンスを確認した後、あなたの正確な状況次第だろう。これらは必要ではありませんが、一部の人にとってはそれをより明確にするかもしれません。

SELECT * 
FROM MyTable 
WHERE 1 = (CASE WHEN Col1 <> '' THEN (CASE WHEN Col1 = @Val1 THEN 1 ELSE 0 END) 
        WHEN Col2 <> '' THEN (CASE WHEN Col2 = @Val2 THEN 1 ELSE 0 END) 
       ELSE 0 
      END) 
関連する問題