ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/DataBase

[SQL] ์˜ค๋ผํด ๋‚ด์žฅ ํ•จ์ˆ˜ - DECODE ํ•จ์ˆ˜์™€ CASE ๋ฌธ ( ๋‹จ์ผํ–‰ ํ•จ์ˆ˜ )

NaNaRin๐Ÿ™ƒ 2021. 3. 3. 16:11

1. DECODE ํ•จ์ˆ˜

- ๊ธฐ์ค€์ด ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์ง€์ •ํ•œ ํ›„ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

- ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” if ์กฐ๊ฑด๋ฌธ ๋˜๋Š” switch-case ๋ฌธ๊ณผ ์œ ์‚ฌ

- ๋งˆ์ง€๋ง‰์˜ '์œ„ ์กฐ๊ฑด 1~n๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ํ•  ๊ฒฐ๊ณผ' ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด NULL ๋ฐ˜ํ™˜

- ์กฐ๊ฑด๋ณ„๋กœ ๋™์ผํ•œ ์ž๋ฃŒํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ

DECODE([๊ฒ€์‚ฌ ๋Œ€์ƒ์ด ๋  ์นผ๋Ÿผ or ๋ฐ์ดํ„ฐ / ์—ฐ์‚ฐ์ด๋‚˜ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ],
	   [์กฐ๊ฑด 1], [๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ๊ฑด 1๊ณผ ์ผ์น˜ํ•  ๋•Œ ๋ฐ˜ํ™˜ํ•  ๊ฒฐ๊ณผ],
       [์กฐ๊ฑด 2], [๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ๊ฑด 2๊ณผ ์ผ์น˜ํ•  ๋•Œ ๋ฐ˜ํ™˜ํ•  ๊ฒฐ๊ณผ],
       … …
       [์กฐ๊ฑด n], [๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ๊ฑด n๊ณผ ์ผ์น˜ํ•  ๋•Œ ๋ฐ˜ํ™˜ํ•  ๊ฒฐ๊ณผ],
       [์œ„ ์กฐ๊ฑด 1~n๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ํ•  ๊ฒฐ๊ณผ])
       
-- 1.
SELECT	EMPNO, ENAME, JOB, SAL,
		DECODE(JOB,
        	   'MANAGER' , SAL*1.1,
               'SALESMAN', SAL*1.05,
               'ANALYST' , SAL,
               SAL*1.03) AS UPSAL
FROM 	EMP;  

  (1) JOB ์ด MANAGER ์ธ ๊ฒฝ์šฐ SAL*1.1์„, SALESMAN ์ธ ๊ฒฝ์šฐ SAL*1.05์„, ANALYST ์ธ ๊ฒฝ์šฐ SAL์„, ๊ทธ ์™ธ์—๋Š” SAL*1.03 ์„ ๋ฐ˜ํ™˜

 

2. CASE ๋ฌธ

- DECODE ํ•จ์ˆ˜์™€ ๊ฐ™์ด ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฐ˜ํ™˜ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉ

- ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•˜๊ณ  ๊ทธ ๊ฐ’์— ๋”ฐ๋ผ ๋ฐ˜ํ™˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ•˜๋Š” DECODE ํ•จ์ˆ˜์™€ ๋‹ฌ๋ฆฌ CASE๋ฌธ์€ ๊ฐ ์กฐ๊ฑด์— ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋กœ ์ƒ๊ด€ ์—†์–ด๋„ ๊ฐ€๋Šฅ

- DECODE ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ CASE ๋ฌธ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ง€๋งŒ CASE ๋ฌธ์€ DECODE ํ•จ์ˆ˜๋กœ ๋ชจ๋‘ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค. CASE ๋ฌธ์˜ ๋ฒ”์šฉ์„ฑ์ด ๋” ๋†’์Œ

- ์กฐ๊ฑด๋ณ„๋กœ ๋™์ผํ•œ ์ž๋ฃŒํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ

CASE 	[๊ฒ€์‚ฌ ๋Œ€์ƒ์ด ๋  ์นผ๋Ÿผ or ๋ฐ์ดํ„ฐ / ์—ฐ์‚ฐ์ด๋‚˜ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ(์„ ํƒ)]
		WHEN [์กฐ๊ฑด 1] THEN [๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ๊ฑด 1๊ณผ ์ผ์น˜ํ•  ๋•Œ ๋ฐ˜ํ™˜ํ•  ๊ฒฐ๊ณผ]
        WHEN [์กฐ๊ฑด 2] THEN [๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ๊ฑด 2๊ณผ ์ผ์น˜ํ•  ๋•Œ ๋ฐ˜ํ™˜ํ•  ๊ฒฐ๊ณผ]
        … …
        WHEN [์กฐ๊ฑด n] THEN [๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ๊ฑด n๊ณผ ์ผ์น˜ํ•  ๋•Œ ๋ฐ˜ํ™˜ํ•  ๊ฒฐ๊ณผ]
        ELSE [์œ„ ์กฐ๊ฑด 1~n๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ํ•  ๊ฒฐ๊ณผ])
END

-- 1.
SELECT	EMPNO, ENAME, JOB, SAL,
CASE	JOB
        WHEN 'MANAGER'  THEN SAL*1.1
        WHEN 'SALESMAN' THEN SAL*1.05
        WHEN 'ANALYST'  THEN SAL
        ELSE SAL*1.03
END		AS UPSAL
FROM 	EMP;  

-- 2. ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ ์—†์ด ์กฐ๊ฑด์‹๋งŒ์œผ๋กœ CASE๋ฌธ ์‚ฌ์šฉํ•˜๊ธฐ
SELECT	EMPNO, ENAME, COMM,
CASE	WHEN COMM IS NULL THEN 'ํ•ด๋‹น์‚ฌํ•ญ ์—†์Œ'
        WHEN COMM = 0	  THEN '์ˆ˜๋‹น ์—†์Œ'
        WHEN COMM > 0	  THEN '์ˆ˜๋‹น : ' || COMM
        ELSE SAL*1.03
END		AS COMM_TEXT
FROM 	EMP;  

  (1) JOB ์ด MANAGER ์ธ ๊ฒฝ์šฐ SAL*1.1์„, SALESMAN ์ธ ๊ฒฝ์šฐ SAL*1.05์„, ANALYST ์ธ ๊ฒฝ์šฐ SAL์„, ๊ทธ ์™ธ์—๋Š” SAL*1.03 ์„ ๋ฐ˜ํ™˜

  (2) COMM ์นผ๋Ÿผ ๊ฐ’์ด NULL์ธ ๊ฒฝ์šฐ, 0์ธ ๊ฒฝ์šฐ, 0์„ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฐ˜ํ™˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •