2012-02-08 85 views
1

一個真正的IF ... THEN語句在這裏會很有用,我傳遞2個參數(cfk_in和senr_in)到我查詢的用戶,並根據帕拉姆是Y或N,我會改變我的查詢,這裏是我當前的查詢:基於參數的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 

因此,這是非常簡單,並會給我所有部分和特定術語的主題代碼。如果用戶將兩個參數都傳遞爲'N',我想只保留它在上面的查詢。如果用戶通過cfk_in ='Y'和senr_in ='N',那麼我想添加「和a.topic_code ='CFK%'」,並且如果用戶通過cfk_in ='N'和senr_in = 'Y',我想添加「和a.topic_code ='SENR'」。我不允許他們通過'Y'。

有沒有辦法在一個查詢中做到這一點?謝謝您的幫助。

+0

這是一個存儲過程中? – darasd 2012-02-08 16:09:01

回答

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',因爲這將不返回任何結果。如果cfk_insenr_in沒有在表中的實際字段,然後將其標記爲綁定變量:

[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:

[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')) 

...在指標1,3,5結合cfk_insenr_in在索引2,4,6

NB:我覺得你的意思是過濾a.topic_code like 'CFK%',不a.topic_code = 'CFK%'

1

有沒有辦法在一個查詢中做到這一點?

絕對。您可以使用OR來「屏蔽」查詢的某些部分。例如,

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

會注意topic_code只有當senr_in = 'N'。否則,整個子表達式將評估爲true,有效地將其自身排除在查詢條件之外。

+0

雖然這個聰明的解決方案不那麼冗長,但我傾向於認爲這些布爾表達式是高度不可讀的,並且在需要時難以正確更改...... – 2012-02-08 16:16:47

+0

@LukasEder這完全取決於表達式的結構。在適當地格式化和評論時,它不應該引起任何問題:畢竟,這個相對廣爲人知的帶有「掩蔽」布爾表達式的「習語」適用於SQL查詢語言的內部和外部,因此它通常只是即刻熟悉。 – dasblinkenlight 2012-02-08 16:24:05

+0

其實,你的表達不正確,因爲如果'cfk_in ='N'和senr_in ='N'',則不應該應用額外的過濾器。我同意「比較有名的成語」。我仍然覺得比使用規範表達式更難修改。但我想這是一個味道問題... – 2012-02-08 16:43:13

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

是的,你可以在一個查詢做到這一點。 SimPy中添加以下到您的where子句:
(注意,我改變了你的a.topic_code = 'CFK%' 來a.topic_code LIKE '%CFK')

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'))