2015-08-31 2 views
0

Я пытаюсь поставить пару операторов if внутри CASE WHERE в выбранном запросе для управления порядком. Это упрощенная версия, которая все еще дает мне синтаксическую ошибку.MySQL IF внутри оператора SWITCH CASE

SELECT stt_stid, st_stid, st_prid, st_first, st_last, YEAR(st_graduation) 
    FROM sttlink 
    INNER JOIN student ON stt_stid = st_stid 
    WHERE stt_prid = 3920103 
    GROUP BY stt_stid 
    ORDER BY 
    CASE 
     WHEN (MONTH(now())>='9') 
     THEN  
      if(YEAR(st_graduation) = YEAR(now()), 0, 1), 
      st_graduation 
     WHEN (MONTH(now())<'9') 
     THEN 
      if(YEAR(st_graduation) >= YEAR(now()), 1, 0), 
      st_graduation 
     END; 

И сообщение об ошибке (Navicat) является:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 
     st_graduation 
    WHEN (MONTH(now())<'9') 
    THEN 
    ' at line 13 

Вот еще материал (спасибо за глядя так далеко!). Это моя оригинальная рабочая версия. Проблема в том, что мне нужно иметь два разных порядка: - в месяц - сентябрь-декабрь, а другой - за январь-август.

ORDER BY if(YEAR(st_graduation)>=YEAR(now()), 0, 1), 
     if(YEAR(st_graduation)>=YEAR(now()), 10000, datediff(now(),st_graduation)), 
     st_graduation 

Вышеупомянутые работы прекрасно, если это январь-август, но мне нужно немного другое в течение месяцев сентября-декабря.

Ответ Рахула очень близок. Теперь я вплоть до 2-й случай внутри высказыванием:

ORDER BY 
CASE 
    WHEN (MONTH(now()) >= '9') 
    THEN  
     CASE WHEN YEAR(st_graduation) = YEAR(now()) THEN 0 ELSE 1 END, 
     CASE WHEN YEAR(st_graduation) = YEAR(now()) THEN 10000 ELSE (datediff(now(),st_graduation)) END 
    WHEN (MONTH(now()) < '9') 
    THEN 
     CASE WHEN YEAR(st_graduation) >= YEAR(now()) THEN 1 ELSE 0 END, 
     CASE WHEN YEAR(st_graduation) = YEAR(now()) THEN 10000 ELSE (datediff(now(),st_graduation)) END 
    END, st_graduation; 

Должен ли я создать 2-й отдельный «главный» случай/когда - то же самое, когда положения, но только с 2-го заявления дела?

+0

' синтаксическая ошибка'? –

+0

опубликуйте образец данных и ожидаемый результат. Что вы пытаетесь достичь? – Alex

ответ

1

Я думаю, что вы имели в виду, чтобы сделать, как показано ниже, используя выражение Nested CASE

ORDER BY 
    CASE 
     WHEN MONTH(now()) >= '9' THEN  
      CASE WHEN YEAR(st_graduation) = YEAR(now()) THEN 0 ELSE 1 END 

Так что в вашем случае предложение ORDER BY должен выглядеть

ORDER BY 
    CASE 
     WHEN (MONTH(now()) >= '9') 
     THEN  
      CASE WHEN YEAR(st_graduation) = YEAR(now()) THEN 0 ELSE 1 END   
     WHEN (MONTH(now()) < '9') 
     THEN 
      CASE WHEN YEAR(st_graduation) >= YEAR(now()) THEN 1 ELSE 0 END 
     END, st_graduation; 
+0

Это очень близко! Спасибо! Могу ли я добавить 2-й CASE внутри каждого основного? См. Исправленный исходный вопрос – Steve

+0

@Steve, да, вы можете. Попробуй и посмотри. – Rahul

+0

Спасибо Рахулу и Алексу Грегу за руководство. Просто нужно настроить их, чтобы получить мои результаты в том порядке, в котором я хочу, но определенно над препятствием здесь. – Steve

1

насчет

SELECT stt_stid, st_stid, st_prid, st_first, st_last, YEAR(st_graduation) 
    FROM sttlink 
    INNER JOIN student ON stt_stid = st_stid 
    WHERE stt_prid = 3920103 
    GROUP BY stt_stid 
    ORDER BY 
    CASE 
     WHEN (MONTH(now())>='9' and YEAR(st_graduation) = YEAR(now())) 
     THEN 
      st_graduation 
     WHEN (MONTH(now())<'9' and YEAR(st_graduation) >= YEAR(now())) 
     THEN 
      st_graduation 
     END; 
Смежные вопросы