2017-09-11 28 views
0

SQL Conditional WhereConditional WHERE clause in SQL Serverに似た質問がありますが、条件が満たされない場合を除き、WHERE句がない場合と同様にすべての行を返します。SQLの条件条件は、条件が満たされない場合にすべてを返します

解決策の1つは、以下を行うことです。 <ColLetter><ColValue><ColLetter>ColAの一つ、ColBColC、又はNULLなり、<ColValue>はこれらの列のいずれかで表示されることができる値である(または<ColLetter>である場合NULLある)する文字列の挿入、であることに留意されたいです。

SELECT ID, ColA, ColB, ColC 
FROM MainTable t 
WHERE (
    -- <ColLetter> is not null, corresponding to a column name in MainTable 
    (ISNULL(<ColLetter>, 0) <> 0 AND t.<ColLetter> = <ColValue>) 
    OR 
    -- <ColLetter> is null, I want to return all rows 
    (ISNULL(<ColLetter>, 0) = 0 AND t.ID is not null) 
) 

この問題は、ID列で不要にヌルがチェックされていること(ヌルがない)であり、大きなテーブルであることが原因です。これを行うより良い方法はありますか?私はこれを読み違えていない限り

答えて

0
where case <colLetter> 
    when '<nameOfColA>' then nameOfColA 
    when '<nameOfColB>' then nameOfColB 
    When '<nameOfColC>' then nameOfColC 
    else isNull(<colValue>, 0) end 
     = isNull(<colValue>, 0)   
+0

つまるところ、私はあなたが誤解していると思います。 ''は、非ID列の1つの名前になります(ヌルでない場合)。 ''は、指定された列の行に表示される値になります。 – conor

+0

大丈夫、はい、私はそれを得ると思います。しかし、あなたは私たちにそれらの列名を教えていないので、私は任意の名前を使用しなければなりませんでした。 (あなたはこれらが何であるかを知っていますか?)実際の名前をSQLに入れてください。 –

+0

この質問の目的のために、私はダミーの名前を使用しましたが、実際の名前である可能性もあります。だから、列の呼び出し 'ID'があり、' ColA'という列、 'ColB'という列、' ColC'という列があります。実際にはもっと多くの列があり、それらは適切な名前(例えば 'Address')を持っています。この答えは、私が思うところではまだ誤解されています。私の説明が貧弱であれば、私の謝罪です! – conor

0

これは

SELECT ID, ColA, ColB, ColC 
FROM MainTable t 
WHERE (
    -- <ColLetter> is null, I want to return all rows 
    ISNULL(<ColLetter>, 0) = 0 
    -- Check the value otherwise 
    OR t.<ColLetter> = <ColValue>) 
) 
+0

Thanks Serg。あなたは非常に近いですが、 ''がヌルでない場合、あなたのバージョンは 't。 = 'ANDの場合は ''がNULLです。私はそれに応じてこれを編集しました(まだピアレビューを待っています)。 – conor

+0

編集は表示されません。 NULL 'tを返す必要がある場合。 'どんな場合でも、' OR t。 IS NULL'が明らかに追加されるべきである。 – Serg

+0

編集が拒否されたようです。私はまた、この回答と私が行った編集の両方が、私がやろうとしていることに対して不十分であることを認識しました。私はこの質問を削除します。十分明確ではなく、回避策として外部(非SQL)手段で問題を解決しました。だから私はそれを削除することはできませんが、私はこの回答を受け入れなければなりませんでした。 – conor

関連する問題