#sql #oracle #sql-update #case
#sql #Oracle #sql-обновление #дело
Вопрос:
У меня есть несколько столов, которые выглядят так
select * from stipend order by subjectid, stipdate; SUBJECTID STIPDATE AMOUNT ---------- ----------- ---------- 10011 31-oct-2021 800 10111 31-jul-2019 2000 10111 31-jul-2021 1500 20022 31-jul-2020 1200 30033 29-feb-2020 1400 40044. 31-jul-2020 1200 40044 31-jul-2021 2000 50055 31-jul-2021 2000 50055 30-sep-2021 1000 select * from subject order by subjectid; SUBJECTID LNAME FNAME PROJID ---------- ------------ -------------------- 10011 Indy Eva XYZ01 10111 Isner Monica XYZ04 11011 Dupont Marty XYZ05 20022 Jordan Sam XYZ01 30033 Jordan Mary XYZ01 40044 Belmont Renee XYZ02 50055 Pissaro Becky XYZ02 60066 Nadal Becky XYZ03 70077 Bardot Brigitte XYZ03 80088 null Eva XYZ03 90099 Garnet Larry XYZ04
И я хочу обновить стипендии, которые есть в проектах XYZ01 и XYZ02, на 40%, используя СЛУЧАЙ, КОГДА построят. Очевидно, что две таблицы связаны по stipend.subjectid = subject.subjectid, и я бы использовал subject.projectid для определения этого, но как бы я сделал это в СЛУЧАЕ, КОГДА?
Вот как я делал это раньше
update stipend set amount = amount (amount * .40) where subjectid in (select subjectid from subject where subject.projid = 'XYZ01' or subject.projid = 'XYZ02');
и это сработало, но теперь мне нужно сделать то же самое, но в СЛУЧАЕ, КОГДА.
Комментарии:
1. Почему вы хотите использовать
case
выражение? Ваш текущий код, похоже, работает, и acase
, похоже, здесь не подходит.
Ответ №1:
Эдди, ниже приведено решение, в котором используется оператор CASE WHEN. Но, как отметил Мурейник в комментариях, ваше решение лучше, чем использование оператора CASE WHEN в этом случае.
-- using CASE WHEN update s set s.amount = (case when x.projid in ('XYZ01','XYZ02') then s.amount (s.amount * .40) else s.amount end) from stipend s join subject x on x.subjectid = s.subjectid
Примечание: Я не добавил x.projid в (‘XYZ01′,’XYZ02’) в предложение where, так как это противоречило бы цели использования СЛУЧАЯ, КОГДА. Таким образом, это будет выполняться для всех строк.