MariaDB๋ MySQL์ด๋ ๋น์ทํ๋ฉด์๋ ๊ฐ๋ ๋ค๋ฅด๊ณ ..
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ๊ณ๊ฐ ๊ทธ๋ ๋ฏ ๋ณต์กํ์ง ์๊ณ ๊น๋ํ ์ฟผ๋ฆฌ๋ฅผ ์ง๊ธฐ๋ ๋๋ฌด ํ๋ค๋ค๋ ๊ฒ..
์๋๋ INSERT ํ INSERT ํ ๊ฐ๋ค์ UPDATE ์ํค๋ ๋ฐฉ์์ผ๋ก ํ๋ ค ํ์ผ๋, ํ ํธ๋์ญ์ ๋ด์์ ์ํํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ์์ด์ INSERT ํ ์ปค๋ฐ์ด ๋์ง ์์ UPDATE๋ ํ ์ ์๋ ๋ฌธ์ ๊ฐ ์์๋ค.
์ด๋ฒ INSERT SELECT WHERE, CASE WHEN ์ฟผ๋ฆฌ๋ ์์งํ ์์ฒญ ๋ง์ ๋๋ ์ฟผ๋ฆฌ๋ ์๋์ง๋ง,
๊ทธ๋๋ SELECT๋ก ๊ฒ์ํ ์ฌ๋ฌ ๊ฐ์ KEY๋ก INSERT ํ๊ธฐ + ์กฐ๊ฑด์ ๋ฐ๋ผ์ CASE WHEN THEN์ ์จ์ ๋๋จธ์ง ๊ฐ๋ค์ ์ง์ ํด์ฃผ๊ธฐ ๋ฑ์ ํด๊ฒฐํ๋ค๋ ์ ์ ๊ธ์ ์จ๋ณธ๋ค.
๊ฒ์ํด๋ MariaDB์ ๋ํ ์ฟผ๋ฆฌ ์์ ๋ ๋ง์ง ์๊ณ ใ ใ MySQL์ ์จ์ผ ํ๋ ๊ฒ์ด ๋ง๋ฆฌ์๋๋น ์ ์ ๋ค์ ๊ณ ์ถฉ์ด๋ผ๋ฉด ๊ณ ์ถฉ..(๋ฌด๋ฃ๋๊น ๋ด์ค!)
๊ทธ๋ผ ์ง๊ธ๋ถํฐ ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ณด์ฌ๋๋ฆฌ๋๋ก ํ๊ฒ ๋ค.
MariaDB(MySQL) INSERT INTO SELECT CASE WHEN THEN ELSE END
<ํด๊ฒฐํด์ผ ํ ์๊ตฌ์ฌํญ>
[์ฌ์ฉ์ ํ ์ด๋ธ]์์ '์ฌ์ฉ์ ์์ด๋'๋ฅผ ๊ฐ์ ธ์์ [์ฐ์ฐจ ํ ์ด๋ธ]์ '์ฌ์ฉ์ ์์ด๋'์ ๋ฃ๊ณ ,
[์ฌ์ฉ์ ํ ์ด๋ธ]์ '์ ์ฌ์ผ'์ ๊ตฌ๋ถํ์ฌ [์ฐ์ฐจ ํ ์ด๋ธ]์ 'ํด๊ฐ ์ผ์'์ ๋ฃ์ด์ค์ผ ํ๋ค.
1๋ ๋ฏธ๋ง์ด๋ฉด ์๋ณ ํด๊ฐ๋ฅผ, ๊ทธ ์ด์์ด๋ฉด 15๊ฐ์ ๊ทผ์ ํด๊ฐ๋ฅผ ๋ฐ๋ก ์ ๊ณตํด์ค์ผ ํ๋ค.
<์ฟผ๋ฆฌ ์์ฑ ์๋๋ฆฌ์ค>
์ด์ฐํ์๋ ๊ถ๊ทน์ ์ผ๋ก ์ทจํด์ผ ํ ์ฟผ๋ฆฌ๋ INSERT ์ด๋ค.
[์ฐ์ฐจ ํ ์ด๋ธ]์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด ๊ทผ๋ณธ์ ์ผ๋ก ํด์ผํ๋ ์ผ์ด๊ธฐ ๋๋ฌธ.
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ํ ์ด๋ธ์ ํ ์ปฌ๋ผ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ SELECT FROM WHERE ๋ฅผ ์ธ ๊ฒ์ด๋ค.
๋ค์์ผ๋ก [์ฐ์ฐจ ํ ์ด๋ธ]์ ๋ค๋ฅธ ์ปฌ๋ผ๋ค์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋ฃ์ด์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์, CASE WHEN THEN ELSE END ๋ฅผ ์จ ์ค ๊ฒ์ด๋ค.
<์ฟผ๋ฆฌ>
INSERT
INTO VCAT_TABLE (
USER_ID -- ์ฌ์ฉ์ id
, TOT_VCATN_DAYCNT -- ์ด ์ฐ์ฐจ
, USE_VCATN_DAYCNT -- ์ฌ์ฉํ ์ฐ์ฐจ(0์ผ๋ก ํ ๊ฒ)
, YRYC_VCATN_DAYCNT -- ๊ธฐ๋ณธ ์ฐ์ฐจ(1๋
์ดํ๋ฉด ๊ฐ์์์ ๋ฐ๋ผ, ์ด์์ด๋ฉด 15๊ฐ)
, CNWK_VCATN_DAYCNT -- ๊ทผ์ ์ฐ์ฐจ(1๋
์ดํ๋ฉด 0๊ฐ, ์ด์์ด๋ฉด ๋
์์ ๋ฐ๋ผ)
, ETC_VCATN_DAYCNT -- ๊ธฐํ ์ฐ์ฐจ(0์ผ๋ก ํ ๊ฒ)
)
SELECT
USER_ID
, CASE
WHEN <![CDATA[ TIMESTAMPDIFF(YEAR, ECNY_DE, DATE_FORMAT(now(), '%Y%m%d')) < 1 ]]>
THEN MONTH(CONVERT(ecny_de,DATE))-1 + ROUND(TIMESTAMPDIFF(DAY,ECNY_DE, DATE_FORMAT(now(),'%Y%m%d') )/365*15)
ELSE 15 + FLOOR(TIMESTAMPDIFF(YEAR, ecny_de, DATE_FORMAT(now(), '%Y%m%d'))/2)
END
, 0
, CASE
WHEN <![CDATA[ TIMESTAMPDIFF(YEAR, ECNY_DE, DATE_FORMAT(now(), '%Y%m%d')) < 1 ]]>
THEN MONTH(CONVERT(ecny_de,DATE))-1 + ROUND(TIMESTAMPDIFF(DAY,ECNY_DE, DATE_FORMAT(now(),'%Y%m%d') )/365*15)
ELSE 15
END
, CASE
WHEN <![CDATA[ TIMESTAMPDIFF(YEAR, ECNY_DE, DATE_FORMAT(now(), '%Y%m%d')) < 1 ]]>
THEN 0
ELSE FLOOR(TIMESTAMPDIFF(YEAR, ecny_de, DATE_FORMAT(now(), '%Y%m%d'))/2)
END
, 0
FROM USER_TABLE
WHERE USE_YN = 'Y' --์ฌ์ฉ๊ฐ๋ฅํ ์ฌ์ฉ์ ๊ตฌ๋ถ
<์ฟผ๋ฆฌ ์ค๋ช >
<![CDATA[ ]]> ์ Mybatis์์ xmlํ์ผ์ MariaDB ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ๋, <> ํ๊ทธ์ ํผ๋ํ์ง ์๋๋ก ์๋ ค์ฃผ๋ ํ๊ทธ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
๋ค์์ ๋ด๊ฐ ์ฌ์ฉํ MariaDB ํจ์ ๋ชฉ๋ก์ด๋ค.
MONTH ํจ์๋ ๋ ์งํ์์ ๋ฐ์ดํฐ์์ ๋ฌ๋ง ๊บผ๋ด์ฃผ๋ ํจ์
CONVERT ํจ์๋ ์คํธ๋ง์ ํน์ ํํ๋ก ๋ฐ๊ฟ์ฃผ๋ ํจ์
ROUND๋ ๋ฐ์ฌ๋ฆผ ํจ์
TIMESTAMPDIFF๋ ๋ ๋ ์ง ๊ฐ์ ์ฐจ์ด๋ฅผ ์๋ ค์ฃผ๋ ํจ์
FLOOR๋ ๋ฒ๋ฆผ ํจ์
์ด ์ฟผ๋ฆฌ๋ฅผ '์ ๋์ ์ผ๋ก ํจ์จ์ ์ธ ์ฟผ๋ฆฌ'๋ผ๊ณ ์๊ฐํ์ง ๋ง๊ณ .. ์ฐธ๊ณ ํด์ ๋ ์ข๊ณ ํจ์จ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ๋ ์ฌ๋ ค๋ณด๋ฉด ์ข๊ฒ ๋ค.
๋๊ธ