2016-10-28 68 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