MySQL вставить в ж / выберите запрос, содержащий случай, когда - PullRequest
0 голосов
/ 31 января 2019

У меня есть триггер INSERT INTO, который я хотел бы, чтобы часть SELECT оценивала значение поля (RDO) и возвращала значение в SchedStatus в соответствии со значением RDO "выходные дни" по сравнению с DAYNAME даты, назначенной дляродительский график.Само расписание создается в цикле while документа php (что хорошо работает).Ниже приведены две мои попытки оценить значение RDO:

INSERT INTO sched_personnel (Sched_Shift_ID, UnitNumber, SupervisorNumber, Rank, Lunch, Assignment, Shift, Squad, RDOs, SchedStatus)  
      SELECT NEW.Sched_Shift_ID, UnitNumber, SupervisorNumber, Rank, Lunch, Assignment, Shift, Squad, RDO, @SchedStatus
      CASE
        WHEN RDO = 'SAT/SUN' AND (DAYNAME(NEW.ShiftDate) = 'Saturday' OR DAYNAME(NEW.ShiftDate) ='Sunday') THEN 'OFF'
        WHEN RDO = 'SUN/MON' AND (DAYNAME(NEW.ShiftDate) = 'Sunday' OR DAYNAME(NEW.ShiftDate) ='Monday') THEN 'OFF'
        WHEN RDO = 'MON/TUE' AND (DAYNAME(NEW.ShiftDate) = 'Monday' OR DAYNAME(NEW.ShiftDate) ='Tuesday') THEN 'OFF'
        WHEN RDO = 'TUE/WED' AND (DAYNAME(NEW.ShiftDate) = 'Tuesday' OR DAYNAME(NEW.ShiftDate) ='Wednesday') THEN 'OFF'
        WHEN RDO = 'WED/THU' AND (DAYNAME(NEW.ShiftDate) = 'Wednesday' OR DAYNAME(NEW.ShiftDate) ='Thursday') THEN 'OFF'
        WHEN RDO = 'THU/FRI' AND (DAYNAME(NEW.ShiftDate) = 'Thursday' OR DAYNAME(NEW.ShiftDate) ='Friday') THEN 'OFF'
        WHEN RDO = 'FRI/SAT' AND (DAYNAME(NEW.ShiftDate) = 'Friday' OR DAYNAME(NEW.ShiftDate) ='Saturday') THEN 'OFF'
        ELSE 'ONS'
      END AS @SchedStatus
      FROM accounts 
      WHERE accounts.Shift = NEW.Shift AND accounts.AccountStatus = 'Active';

Я также попытался:

INSERT INTO sched_personnel (Sched_Shift_ID, UnitNumber, SupervisorNumber, Rank, Lunch, Assignment, Shift, Squad, RDOs, SchedStatus)  
      SELECT NEW.Sched_Shift_ID, UnitNumber, SupervisorNumber, Rank, Lunch, Assignment, Shift, Squad, RDO, @SchedStatus
      CASE
        WHEN RDO = 'SAT/SUN' AND DAYNAME(NEW.ShiftDate) IN ('Saturday', 'Sunday') THEN 'OFF'
        WHEN RDO = 'SUN/MON' AND DAYNAME(NEW.ShiftDate) IN ('Sunday', 'Monday') THEN 'OFF'
        WHEN RDO = 'MON/TUE' AND DAYNAME(NEW.ShiftDate) IN ('Monday', 'Tuesday') THEN 'OFF'
        WHEN RDO = 'TUE/WED' AND DAYNAME(NEW.ShiftDate) IN ('Tuesday', 'Wednesday') THEN 'OFF'
        WHEN RDO = 'WED/THU' AND DAYNAME(NEW.ShiftDate) IN ('Wednesday', 'Thursday') THEN 'OFF'
        WHEN RDO = 'THU/FRI' AND DAYNAME(NEW.ShiftDate) IN ('Thursday', 'Friday') THEN 'OFF'
        WHEN RDO = 'FRI/SAT' AND DAYNAME(NEW.ShiftDate) IN ('Friday', 'Saturday') THEN 'OFF'
        ELSE 'ONS'
      END AS @SchedStatus
      FROM accounts 
      WHERE accounts.Shift = NEW.Shift AND accounts.AccountStatus = 'Active';

Я получаю сообщение об ошибке:

Ошибка SQL (1064):У вас есть ошибка в вашем синтаксисе SQL;проверьте правильность синтаксиса для руководства, соответствующего версии вашего сервера MySQL, рядом с 'CASE WHEN RDO =' SAT / SUN 'и именем дня (NEW.Shift Date) IN (' суббота ',' воскресенье ') в строке 4.

Если я исключу часть запроса CASE, дочерние записи будут добавлены в каждую родительскую запись, созданную без ошибок.Желаемым конечным состоянием является вставка каждой дочерней записи (sched_perssonel), имеющей SchedStatus, которая соответствует RDO индивидуума по умолчанию, следовательно, CASE оценивает RDO по сравнению с датой расписания (tabel sched_shift).Я не могу получить дело, когда правильно.

Спасибо за помощь.

1 Ответ

0 голосов
/ 31 января 2019

Я нашел 3 ошибки

1) В вашем коде у вас есть 10 столбцов для в, но 11 в выбранных ..

2) В вашем коде у вас есть

  ...,   @SchedStatus

  CASE
    WHEN RDO = 'SAT/SUN' .......

Вы пропустили запятую между @SchedStatus и CASE
Но, глядя на ваш код ... я думаю, вам не нужен @schedStatus, и я удалил

3) в конце у вас есть псевдоним @schedStatusCASE ... но при использовании вставки select не требуется псевдоним

INSERT INTO sched_personnel (Sched_Shift_ID, UnitNumber, SupervisorNumber, Rank, Lunch, Assignment, Shift, Squad, RDOs, SchedStatus)  
    SELECT NEW.Sched_Shift_ID
      , UnitNumber
      , SupervisorNumber
      , Rank
      , Lunch
      , Assignment
      , Shift
      , Squad
      , RDO
      , CASE
      WHEN RDO = 'SAT/SUN' AND (DAYNAME(NEW.ShiftDate) = 'Saturday' OR DAYNAME(NEW.ShiftDate) ='Sunday') THEN 'OFF'
      WHEN RDO = 'SUN/MON' AND (DAYNAME(NEW.ShiftDate) = 'Sunday' OR DAYNAME(NEW.ShiftDate) ='Monday') THEN 'OFF'
      WHEN RDO = 'MON/TUE' AND (DAYNAME(NEW.ShiftDate) = 'Monday' OR DAYNAME(NEW.ShiftDate) ='Tuesday') THEN 'OFF'
      WHEN RDO = 'TUE/WED' AND (DAYNAME(NEW.ShiftDate) = 'Tuesday' OR DAYNAME(NEW.ShiftDate) ='Wednesday') THEN 'OFF'
      WHEN RDO = 'WED/THU' AND (DAYNAME(NEW.ShiftDate) = 'Wednesday' OR DAYNAME(NEW.ShiftDate) ='Thursday') THEN 'OFF'
      WHEN RDO = 'THU/FRI' AND (DAYNAME(NEW.ShiftDate) = 'Thursday' OR DAYNAME(NEW.ShiftDate) ='Friday') THEN 'OFF'
      WHEN RDO = 'FRI/SAT' AND (DAYNAME(NEW.ShiftDate) = 'Friday' OR DAYNAME(NEW.ShiftDate) ='Saturday') THEN 'OFF'
      ELSE 'ONS'
    END A
    FROM accounts 
    WHERE accounts.Shift = NEW.Shift AND accounts.AccountStatus = 'Active';
...