2016-08-09 1 views
0

나는 다음과 같은 쿼리가 :ORA-00905 : CASE의 THEN 절에 대한 키워드가 누락 되었습니까?

는 위의 쿼리 포스트 그레스와 MySQL을위한 그러나 오라클에서 작동
SELECT name,tid FROM table_name WHERE status=1 AND 
CASE 
WHEN EXISTS (SELECT 1 FROM table_name WHERE name='name1' AND tid='tid1' AND status=1) 
THEN name='name1' AND tid='tid1' 
ELSE name='name2' AND tid='tid2' 
END; 

내가이 오류를 :

THEN name='name1' AND AND tid='tid1' 
     * 
ERROR at line 4: 
ORA-00905: missing keyword 

사람은 무슨 여기에 잘못 말해 주시겠습니까 어떻게 수정하는 방법 쿼리는 에 대한 세 가지 작동하도록 - 포스트 그레스, MySQL과 오라클

+0

그것은 업데이트가 아닌 선택 쿼리입니다. 당신은 그와 같은 필드에 값을 할당 할 수 없습니다. –

+0

값을 지정하지 않고'name = "name1"AND tid = "tid1"'은 WHERE 절의 일부입니다. 그리고 쿼리는 mysql과 postgres에서 작동합니다. 문제는 제가 직면 한 것이 오라클에 있습니다. – user2713255

+0

예, 그렇습니다. 'name = "name1"'은 "결정"컨텍스트에 없으며, "then"에 있습니다. 여기서 case 문 결과에 대한 값을 반환해야합니다. –

답변

1

오라클에서는 CASE 문은 부울 표현식을 반환 할 수 없습니다. 여기에 CASE없이 당신이 원하는 것을 할 수있는 방법 중 하나입니다 :

SELECT name, tid 
FROM table_name 
WHERE status = 1 AND 
     (EXISTS (SELECT 1 FROM table_name WHERE name = 'name1' AND tid = 'tid1' AND status = 1) AND 
     name = 'name1' AND tid = 'tid1' 
    ) OR 
     (NOT EXISTS (SELECT 1 FROM table_name WHERE name = 'name1' AND tid = 'tid1' AND status = 1) AND 
     name = 'name2' AND tid = 'tid2' 
    ); 

은 또는, 당신은이를 표현할 수 :

SELECT name, tid 
FROM table_name 
WHERE status = 1 AND 
     (CASE WHEN EXISTS (SELECT 1 FROM table_name WHERE name = 'name1' AND tid = 'tid1' AND status = 1) 
      THEN (CASE WHEN name = 'name1' AND tid = 'tid1' THEN 'true' END) 
      ELSE (CASE WHEN name = 'name2' AND tid = 'tid2' THEN 'true' END) 
    ) = 'true' 

가 까다로울 수있다 논리 값과 CASE 이해. 중첩 된 CASE 문을 사용하는 경우에도 마찬가지입니다. 그러나이 버전은 하위 쿼리를 한 번만 실행하면되는 이점이 있습니다.

0

Oracle에서는 CASE 표현식을 사용하여 WHERE 절에 절을 추가 할 수 없습니다. 내가 뭘 하려는지 정확히 이해했다면 쿼리가 간단해질 것 같습니다.

SELECT name, tid 
    FROM table_name 
    WHERE STATUS = 1 AND 
     ((NAME = 'name1' AND 
      TID = 'tid1') OR 
     (NAME = 'name2' AND 
      TID = 'tid2')) 

행운을 빈다.

+0

존재하는 조건은 무엇입니까? 나는 name = 'name1'과 tid = "tdi1"'을 사용하고 싶습니다. 그렇지 않으면 그 조건을 가진 레코드가 존재할 때만 사용합니다. name = 'name2'AND tid = ' tid2'' – user2713255

+0

글쎄, 당신은 TABLE_NAME에서 데이터를 가져 오는 중이며 EXISTS 검사는 TABLE_NAME에 대해 수행됩니다. 적어도 저에게는 중복 된 것처럼 보입니다. 데이터가 존재하지 않으면 가져 오지 않을 것입니다. 따라서 EXISTS 검사가 전혀 필요 없다고 생각합니다 .SELECT의 TABLE_NAME이 EXISTS의 TABLE_NAME과 다르지 않은 경우 ??? –

+0

내 요구 사항은'name = '에 대한 레코드가 없다면 name1 'AND tid ='tid1 ''그런 다음 하나의 쿼리에서 동일한 이름의 'name ='name2 'AND tid ='tid2 ''로 레코드를 가져 오도록 대체해야합니다 – user2713255

관련 문제