2016-10-28 3 views
0

Я пытаюсь написать запрос, в котором мне нужно выполнить выбор в предложении where в соответствии с определенной переменной.Case when in 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.

Это решение хорошо работает в случае, если у вас есть только 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

Как правило, лучше использовать 'AND' /' OR' вместо выражений 'case' в предложении' WHERE'. – 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, и принимать только значения, определенные в clin_schd в случае, если schd_yn установлен на 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