2014-06-16 2 views
0

m_reaplicacao라는 매개 변수가있는 프로 시저를 만들려고합니다. 이 매개 변수는 '예'의 경우 'S', 아니오 인 경우 'N'및 모든 레코드의 'T'값을받습니다. 매개 변수가 예이면 값이 9 인 레코드를 반환해야합니다. 매개 변수가 아니요 인 경우 9와 다른 레코드를 반환해야합니다. 마지막으로 값이 모두이면 모든 레코드를 반환해야합니다. 탁자. 코드 울부 짖는 소리와 오라클은 말한다 : PL/SQL : ORA-00905 : 누락 된 키워드 라인 : 84 텍스트 : 절차에 대한 컴파일 오류가 오류 MYDB.CONTAS_A_PAGAR_SPS ta.id_1a_cbr = 9;
where 절 내의 case 사용

select * from proposta ta 
    where 
      ta.estado = 'RJ' 
      and case 
       when m_reaplicacao = 'S' then 
        ta.id_1a_cbr = 9; 
       when m_reaplicacao = 'N' then 
        ta.id_1a_cbr <> 9 
       else null 
      end case; 

나는 많은 게시물을 보았지만이 문제를 해결하지 못했습니다. 누군가 나를 도와 줄 수 있습니까?

+2

'END'는'END CASE'가 아닌 'END'를 사용하십시오. 그리고 당신은'm_reaplicacao ='를 사례 문장 밖으로 옮겨야 할 수도 있습니다. – Andrew

+0

아, 그 말은 case 문 밖에서'ta.id_1a_cbr '로되어있다. – Andrew

답변

4

부울 평가의 간단한 조합을 실제로 원할 때 WHERE 절에 CASE 문을 사용하지 마십시오.

WHERE ta.estado = 'RJ' 
    AND ( m_reaplicacao = 'T' 
     OR (m_reaplicacao = 'S' AND ta.id_1a_cbr = 9) 
     OR (m_reaplicacao = 'N' AND ta.id_1a_cbr <> 9) 
    ) 

어떤 이유로 당신이 정말 CASE 문을 사용하려는 경우, 당신은 당신이 WHERE 절에 체크 값을 반환 할 CASE 필요 했어. 예를 들어,

WHERE ta.estado = 'RJ' 
    AND (CASE WHEN m_reaplicacao = 'S' AND ta.id_1a_cbr = 9 
      THEN 1 
      WHEN m_reaplicacao = 'N' AND ta.id_1a_cbr <> 9 
      THEN 1 
      WHEN m_reaplicacao = 'T' 
      THEN 1 
      ELSE 2 
     END) = 1 

그러나 이것은 일반적으로 이러한 종류의 조건을 표현하는 가장 명확한 방법은 아닙니다.

+1

왜 case 문과 1을 비교합니까? – BabyboBNukes

+1

@BabyboBNukes - 당신이 그 접근법을 사용한다면 당신은'case' 문을 뭔가와 비교해야만합니다. (내가 말했듯이, 처음에는'case'를 사용하지 말 것). 1은 반환하고 비교할 수있는 쉬운 값입니다. -1 또는 17 또는 'a'를 반환하고 선택한 경우이 값과 비교할 수 있습니다. –

1

당신은 쉬운 추가 WHERE 기준을 추가, CASE 문에서 식을 반환 할 수 없습니다 설정 :

select * 
from proposta ta 
where ta.estado = 'RJ' 
    and (
     (m_reaplicacao = 'S' AND ta.id_1a_cbr = 9) 
     OR (m_reaplicacao = 'N' AND ta.id_1a_cbr <> 9) 
     ) 

당신이 NULL 상황에서 발생하는 것이 확실하지.

0

당신은 다음과 같이 SELECT 문에 CASE를 사용할 수 있습니다 우리가 행을 찾고

다음
with d as (
    select 'A' as val from dual 
    union 
    select 'B' as val from dual 
    union 
    select 'C' as val from dual 
) 
select * 
from d 
where 
    case 
     when val = 'A' then 1 
     when val = 'B' then 1 
     when val = 'Z' then 1 
    end = 1; 

곳 ('A', 'B', 'Z')의 발. 이 예제에서 쓰는 다른 방법은 다음과 같습니다.

select ... where val in ('A','B','Z');