by 포동푸우 [SQL Query] MariaDB IF ELSE 2개 문장 1개로 병합. [2022.07.04 10:14:56]
-- 문장을 효율적으로 수정하려면, 어느 부분을 더 수정해야 할지 조건을 부탁드립니다.
-- 실행 환경은 MariaDB 입니다.
-- 안녕하세요.,, 아래의 2개 문장을 한번에 실행하려고, IF 문을 사용해서 아래와 같이 변경해 보았습니다.
-- SQL1
UPDATE TB_APRV
SET PROC_PRGM_ID = 'TEST'
WHERE APRV_DOC_ID = 'A20220704100201'
AND APRV_ORD = 6
AND SB_APRV_ORD = 1
AND ( SELECT COUNT(*) CNT
FROM TB_APRV
WHERE APRV_DOC_ID = 'A20220704100201'
AND APRV_ORD IN (4,5)
AND APRV_RJCT_YN IS NULL) = 0
-- SQL2
UPDATE TB_APRV
SET PROC_PRGM_ID = 'TEST'
WHERE APRV_DOC_ID = 'A20220704100201'
AND APRV_ORD = 5
AND SB_APRV_ORD = (1+1)
AND ( SELECT COUNT(*) CNT
FROM TB_APRV
WHERE APRV_DOC_ID = 'A20220704100201'
AND APRV_ORD IN (4,5)
AND APRV_RJCT_YN IS NULL) > 0
-- SQL1+2
IF (SELECT count(*) CNT
FROM TB_APRV
WHERE APRV_DOC_ID = 'A20220704100201'
AND APRV_ORD IN (4,5)
AND APRV_RJCT_YN IS NULL) = 0 then
UPDATE TB_APRV SET PROC_PRGM_ID = 'TEST'
WHERE APRV_DOC_ID = 'A20220704100201'
AND APRV_ORD = 6
AND SB_APRV_ORD = 1
ELSE
UPDATE TB_APRV SET PROC_PRGM_ID = 'TEST'
WHERE APRV_DOC_ID = 'A20220704100201'
AND APRV_ORD = 5
AND SB_APRV_ORD = (1+1)
END IF
-- 문장을 효율적으로 수정하려면, 어느 부분을 더 수정해야 할지 조건을 부탁드립니다.
업데이트할 값을 변수에 담아 처리하면 UPDATE 문 한번만 쓰면 되겠네요.
그런데. 개인적인 의견입니다만.
count 조건이나 update 값이 뭔가 이상해 보이고, 불합리해 보입니다. 제 눈에는...
업데이트 할 값을 변수에 담아 Update 문을 한번만 쓸 수 있다는 부분을 제가 이해를 못했네요. 혹시 좀 더 설명해 주실 수 있을까요 ?
포동푸우님 안녕하세요~
MariaDB는 잘모르긴 하지만
Merge Into 문 쓰시는게 깔끔할것 같은데요.
update 할 row만 select 해서 넣으면 되니까요..
Merge 로도 변경해 보겠습니다.
-- 문법이 맞는지는 모르겠지만, 요런 형태.. IF 조건 THEN SET @v1 = 6; SET @v2 = 1; ELSE SET @v1 = 5; SET @v2 = 2; END IF; UPDATE ... SET ... WHERE aprv_doc_id = 'A20220704100201' AND aprv_ord = @v1 AND sb_aprv_ord = @v2 ;
추가 설명 고맙습니다.
-- 한 방 쿼리 --
UPDATE tb_aprv a
INNER JOIN
(SELECT CASE WHEN COUNT(*) = 0 THEN 6 ELSE 5 END aprv_ord
, CASE WHEN COUNT(*) = 0 THEN 1 ELSE 2 END sb_aprv_ord
FROM tb_aprv
WHERE aprv_doc_id = 'A20220704100201'
AND aprv_ord IN (4, 5)
AND aprv_rjct_yn IS NULL
) b
ON a.aprv_doc_id = 'A20220704100201'
AND a.aprv_ord = b.aprv_ord
AND a.sb_aprv_ord = b.sb_aprv_ord
SET proc_prgm_id = 'TEST'
;
이렇게도 되네요,, 고맙습니다.