Как сохранить условие Case или IF в переменную в MySQL

#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 образом…