WHERE句をこの擬似SQLでどのように書き直しますか?WHERE句のSQL If-Elseとカラム値に基づく条件
SELECT *
FROM MyTable
WHERE IF (Col1 <> '') Col1 = @Val1
ELSEIF (Col2 <> '') Col2 = @Val2
WHERE句をこの擬似SQLでどのように書き直しますか?WHERE句のSQL If-Elseとカラム値に基づく条件
SELECT *
FROM MyTable
WHERE IF (Col1 <> '') Col1 = @Val1
ELSEIF (Col2 <> '') Col2 = @Val2
あなたの擬似コードの正しい同等です:
WHERE (Col1 <> '' AND Col1 = @Val1) OR
(Col1 = '' AND Col2 <> '' AND Col2 = @Val2)
これはCol2
上Col1
してからの最初の、優先順位に一致します。 Col1
が空の文字列の場合は、Col2
に移動します。
注:このバージョンでは、Col1
がNULL
ではないことが前提です。 NULL
の値をサポートする必要がある場合は、ロジックに簡単に組み込むことができます。
ありがとう、これはまさに正しいです。 2番目のORブロックに追加のチェックを追加して、Col1 = ''かどうかを確認する必要がありました。それ以外の場合は前のブロックが優先されます。 –
私はあなたのロジックを正しく理解していると仮定します。 col1 = @ val1またはcol1に一致する空白文字列 OR col2 = @ val2またはcol2は空の文字列です。
SELECT *
FROM MyTable
WHERE (Col1 = @Val1 OR Col1 = '')
OR (Col2 = @Val2 OR Col2 = '')
これは実際に私のコードの正しい解釈ではないので、この場合はうまくいかないでしょう。 –
まあ、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)
このようにIFを使用することはできません。 IFはフローを制御するためのステートメントです。スカラー値を返すために使用されるCASEのような式が必要です。 –
あなたのロジックは何か(普通英語)? – Eli
それは正しい@SeanLangeです。だから私はそれを "擬似SQL"と呼んでいます:) –