2011-05-14 6 views
0

MySQL 쿼리 내부에 if/else 스턴트를 추가해야하지만 제대로 작동하지 않습니다.MySQL - IF 사용 ... 쿼리 내 ELSE 사용

다음은 내가 달성하고자하는 의사 코드의 예입니다.

SELECT * 
FROM calendar 
WHERE calendar.alert = 1 

IF calendar.repeat = 0 THEN HAVING calendar.UTC_1 > UNIX_TIMESTAMP(); 

ELSE "get all records regardless of calendar.repeat value"; 

END IF; 

이 문제를 해결하기위한 제안이 있으십니까? 나는이 MySQL의 올바른 구문을 찾지 못했습니다.

도와 주셔서 감사합니다.

+0

물어볼 수있는 것은 아닙니다. 가능하지만 할 수는 없습니다. 가능한 최고의 성능 옵션. –

답변

1
SELECT * 
FROM calendar 
WHERE calendar.alert = 1 
AND CASE 
WHEN `repeat` =0 THEN UTC_1 > UNIX_TIMESTAMP() 
ELSE 1=1 END; 

IF-ELSE은 저장 프로 시저/트리거 본문에만 사용할 수 있습니다. 당신은 SELECTIF(condition, value_if_condition_is_true, value_if_condition_is_false)을 사용할 수 있습니다,하지만 난 CASE을 선호하는 (쉽게 나는 모든 여기 구문을 가지고 확실하지에

.... AND IF(`repeat` = 0, UTC_1>UNIX_TIMESTAMP(),1=1) 
+0

이 레코드들에 대해'calendar.alert = 1'이 true로 설정되어 있습니까? 어쩌면 그것은'AND' 대신'OR'이어야합니다 - 당신 질문으로부터 얻지 못했습니다 – a1ex07

+0

죄송합니다. 귀하의 코드가 작동 할 때 내 의견을 업데이트했습니다 - 코드가 작동합니다. 'alert = 0'을 가지고 있기 때문에 처음에는 돌아 오지 않습니다 - 한번 수정하면 잘 작동합니다 - 도와 줘서 고마워요! – pepe

1

위의 쿼리를 다시 작성할 수 있습니다,하지만 난 내 생각에.이 같은 somethign의 아이디어를 좋아하지 장래에 살펴보고 다음 예제를 사용하는 두 그룹을 보는 것이 훨씬 쉽습니다. MySQL에서 사례 vs 유니온의 효율성에 대해 교육받지 못했지만, 음, 아마도 누군가 대답 할 수 있겠습니까?

SELECT * 
FROM calendar 
WHERE 
    calendar.alert = 1 
    AND calendar.repeat = 0 
    AND calendar.UTC_1 > UNIX_TIMTESTAMP(); 
UNION 
SELECT * 
FROM calendar 
WHERE 
    calendar.alert = 1 
    AND calendar.repeat != 0 
+0

감사합니다. @ wilbbe01 - 이것도 시도해 보겠습니다. – pepe