2012-02-08 14 views
1

真のIF ... THEN文はここでは便利ですが、わかりません。だから、これはSQLクエリがパラメータに基づいて変更されています

select a.course_id, a.topic_code 
from course_sections a, 
statuses b 
where a.course_id = b.course_id 
    and term = upper('2010FALL') 
    and status = 'P' and pos = 1 

:私は私のクエリに2つのパラメータ(cfk_inとsenr_in)を渡してユーザーを持っている、とparamはYまたはNであるかどうかに基づいて、私は私のクエリを変更します、ここに私の現在のクエリですかなりシンプルで、特定の用語のすべてのセクションとトピックコードを私に与えるでしょう。ユーザーが両方のパラメータを 'N'として渡す場合は、上記のクエリでそのまま保持します。ユーザーがcfk_in = 'Y'とsenr_in = 'N'を渡した場合、 "and a.topic_code = 'CFK%'"を追加したいと思います。ユーザーがcfk_in = 'N'でsenr_in = 'Y'、 "and a.topic_code = 'SENR'"を追加したいと思います。私はそれらを両方とも 'Y'として渡すことを許可していません。

1つのクエリでこれを行う方法はありますか?助けてくれてありがとう。

+0

が、これは、ストアドプロシージャ内にある(注、私は変更されたあなたのa.topic_code = 'CFK%は' 'CFKの%' のようなa.topic_codeしますか)? – darasd

答えて

2

それは非常に簡単です:

[your query...] 
and ((cfk_in = 'N' and senr_in = 'N') or 
    (cfk_in = 'Y' and senr_in = 'N' and a.topic_code like 'CFK%') or 
    (cfk_in = 'N' and senr_in = 'Y' and a.topic_code = 'SENR')) 

それは何の結果も返さないだろう、これはまた、'Y'として両方のパラメータを渡す禁止します。インデックス1でcfk_in、3、5を結合...

[your query...] 
and ((? = 'N' and ? = 'N') or 
    (? = 'Y' and ? = 'N' and a.topic_code like 'CFK%') or 
    (? = 'N' and ? = 'Y' and a.topic_code = 'SENR')) 

[your query...] 
and ((:cfk_in = 'N' and :senr_in = 'N') or 
    (:cfk_in = 'Y' and :senr_in = 'N' and a.topic_code like 'CFK%') or 
    (:cfk_in = 'N' and :senr_in = 'Y' and a.topic_code = 'SENR')) 

またはJavaで:cfk_insenr_inがあなたのテーブル内の実際のフィールドでない場合は、バインド変数としてマーク、およびインデックスでsenr_in 2、4、6

NB:私はあなたがa.topic_code like 'CFK%'をフィルタリングするためのものだと思い、ないa.topic_code = 'CFK%'

1

1つのクエリでこれを行う方法はありますか?

絶対に。 ORを使用すると、クエリの一部をマスクすることができます。例えば、

AND (senr_in <> 'N' OR a.topic_code = 'CFK%') 

topic_codeのみsenr_in = 'N'に注意を払うだろう。それ以外の場合、部分式全体はtrueと評価され、クエリ条件から効果的に除外されます。

+0

この巧妙な解決策はそれほど冗長ではありませんが、この種のブール式は非常に読みにくく、必要に応じて正しく変更するのが難しいと感じる傾向があります。 –

+0

@LukasEderこれは完全に式の構造に依存します。適切に書式化され、コメントされると、それは問題を起こすべきではありません。結局のところ、この比較的よく知られた "イディオム"と "マスキング"論理式は、SQLクエリ言語の内側と外側の両方に適用可能です。 – dasblinkenlight

+0

実際には、 'cfk_in = 'N'とsenr_in = 'N''の場合、フィルタを追加する必要がないため、式が正しくありません。私は「比較的よく知られているイディオム」に同意します。それでも、正規表現が使用されている場合よりも、これを変更するのが難しいことがわかります。しかし、私はそれが味の問題だと思う... –

0

確かに、方法があります。

select a.course_id, a.topic_code 
from course_sections a, 
statuses b 
where a.course_id = b.course_id 
    and term = upper('2010FALL') 
    and status = 'P' and pos = 1 
    and ((cfk_in = 'Y' and senr_in = 'N' and a.topic_code like 'CFK%') or  
     (cfk_in = 'N' and senr_in = 'Y' and a.topic_code = 'SENR') or 
     (cfk_in = 'N' and senr_in = 'N')) 
0

はい、これは1つのクエリで行うことができます。 あるSimpyにはに、次の追加条項:

AND (@cfk_in = 'N' OR (@cfk_in = 'Y' AND a.topic_code LIKE 'CFK%')) 
AND (@senr_in = 'N' OR (@senr_in = 'Y' AND a.topic_code = 'SENR')) 
関連する問題