2016-10-28 76 views
0

我想寫一個查詢,在這個查詢中我必須根據一個已定義的變量在where子句中執行一個選擇。在where子句時的情況

我的劇本是這樣的:

def schd_yn ='Y'; 
def clin_schd = '1,2'; 

CREATE TABLE TEMP_SUBOPT AS 
    SELECT * 
    FROM P112921.SCHEDULE_DATA  
    WHERE clin_sch IN (CASE WHEN '&schd_yn.' = 'Y' 
          THEN &clin_schd. 
          ELSE clin_sch 
         END) 
; 

我想什麼做的究竟是採取所有數據從我的情況下,源schd_yn設置爲N,並採取只在clin_schd定義的值case schd_yn設置爲Y.

該解決方案適用於您在clin_sched中只有1個值的情況。

這些組合效果很好:

def schd_yn='Y'; //takes only clin_sch=1 
def clin_schd='1'; 

def schd_yn='N'; //takes everything as expected 
def clin_schd='1'; 

這些組合無法正常工作,並生成錯誤:

def schd_yn='Y'; 
def clin_schd='1,2'; 

def schd_yn='N'; 
def clin_schd='1,2'; 

是否有人知道如何使這項工作?

謝謝

+3

通常最好在'WHERE'子句中使用'AND' /'OR'而不是'case'表達式。 – jarlh

+1

不要在SQL中使用逗號分隔值。這隻會導致你很多麻煩。 – jarlh

+0

@a_horse_with_no_name:你不應該刪除sqldeveloper標籤,因爲這個腳本看起來像SQL Developer特有的。我又添加了標籤。 –

回答

0

你可以使用這樣的:

select ... 
from 
your_table 
where 
def schd_yn='Y' and def clin_schd='1' 
union all 
select ... 
from 
your_table 
where 
def schd_yn='N' and def clin_schd='1'; 
0

我想你想要這樣的邏輯:

WHERE (&schd_yn = 'N' OR clin_sch = &clin_schd) 

您所要求的:

我想要做的就是從我的源頭獲取所有數據 情況下schd_yn被設定爲N,並採取只在殼體schd_yn在 clin_schd定義的值被設定爲Y.

上述工程如果schd_yn只能是'N''Y'(一個合理的假設,在我的想法)。更正式地說,你似乎想要:

WHERE (&schd_yn = 'N' OR (&schd_yn = 'Y' AND clin_sch = &clin_schd)) 
+0

我認爲這將是我想要的邏輯,但是,如果我的schd_yn ='N',離開clin_schd ='' 然而這並不起作用 – martinlegrand