#mysql #case #conditional-statements
#mysql #случай #условные операторы
Вопрос:
Как сохранить регистр условий или if в переменную?
поэтому мне не нужно снова записывать то же условие для next.
это синтаксис mysql :
SELECT v_jadwal_personal.ID_karyawan,
v_jadwal_personal.nik_karyawan,
(CASE WHEN
(SELECT wkt_masuk FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja) < 0
THEN
ADDTIME(jam_masuk,(SELECT wkt_plg FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja))
WHEN
(SELECT wkt_masuk FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja) >= 0
THEN
ADDTIME(jam_masuk,(SELECT wkt_plg FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja))
END) AS jammasuk,
(CASE WHEN
(SELECT wkt_plg FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja) < 0
THEN
ADDTIME(jam_pulang,(SELECT wkt_plg FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja))
WHEN
(SELECT wkt_plg FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja) >= 0
THEN
ADDTIME(jam_pulang,(SELECT wkt_plg FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja))
END) AS jampulang,
v_jadwal_personal.totaljam,
v_tmp_history_absensi.waktu_masuk,
v_tmp_history_absensi.waktu_pulang,
v_tmp_history_absensi.hari_kerja,
v_tmp_history_absensi.tgl_kerja,
v_tmp_history_absensi.nama_karyawan,
TIMEDIFF(waktu_pulang,waktu_masuk) AS totaljamkerja,
(CASE WHEN
(SELECT wkt_masuk FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja) < 0
THEN
TIMEDIFF(waktu_masuk,(ADDTIME(jam_masuk,(SELECT wkt_plg FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja))))
WHEN
(SELECT wkt_masuk FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja) >= 0
THEN
TIMEDIFF(waktu_masuk,(ADDTIME(jam_masuk,(SELECT wkt_plg FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja))))
END) AS terlambat,
TIMEDIFF(jam_pulang,waktu_pulang) as lebihan,
(SELECT wkt_masuk FROM d_jamkerja_khusus
WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja) AS teswaktu
FROM v_jadwal_personal JOIN v_tmp_history_absensi
ON v_tmp_history_absensi.ID_karyawan = v_jadwal_personal.ID_karyawan
AND v_tmp_history_absensi.hari_kerja = v_jadwal_personal.nama_hari
WHERE v_tmp_history_absensi.tgl_kerja BETWEEN '2014-05-14' AND '2014-05-23'
AND v_jadwal_personal.ID_karyawan=1
итак, я думаю, что слишком много условий case и имеют одинаковое условие..
Комментарии:
1. это очень грязный код. Ты должен это убрать
2. @Gergo, спасибо за редактирование 🙂 я новичок в stackoverflow 🙂
3. @fallenreaper, да, вот почему я спрашиваю здесь 🙂 надеюсь, кто-нибудь может мне помочь 🙂
4. может у кого-нибудь есть идея?
Ответ №1:
Вероятно, вы можете использовать подзапрос в качестве одной из таблиц:
SELECT ...
FROM table this
JOIN table that ON condition
JOIN
(
SELECT long_computation AS result
FROM table
WHERE condition
) s ON condition
WHERE condition
Затем вы можете использовать s.result.
Альтернативой является использование представления, но это допустимо только в том случае, если бит для факторизации всегда один и тот же.
Комментарии:
1. вы имеете в виду, что я ставлю условие case в подзапросе, а затем присоединяюсь?
2. Вероятно, вы можете использовать
(SELECT wkt_masuk, wkt_plg FROM d_jamkerja_khusus WHERE tgl_krj BETWEEN '2014-05-14' AND '2014-05-23' AND tgl_krj=v_tmp_history_absensi.tgl_kerja)
, чтобы у вас был легкий доступ к wkt_masuk и wkt_plg. То же самое и с другим.3. На самом деле, вам, вероятно, нужно переместить хотя бы часть условия в условие СОЕДИНЕНИЯ, но я слишком ленив, чтобы пытаться расшифровать весь SQL и выяснить, что именно вы должны делать 🙂
4. но там у меня есть такое условие, как: ВЫБЕРИТЕ wkt_masuk ИЗ d_jamkerja_khusus, ГДЕ tgl_krj МЕЖДУ ‘2014-05-14’ И ‘2014-05-23’ И tgl_krj=v_tmp_history_absensi.tgl_kerja) < 0
5. Само условие вы оставляете в
CASE WHEN
(поскольку есть разные случаи …), Но вы можете упростить их следующимCASE WHEN s.wkt_masuk<0
образом…