ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Programming/Database

ORACLE ์Œ์ˆ˜๋ฅผ 0์œผ๋กœ ๋ณ€ํ™˜

๋‹ค๋ฃจ์‚ฌ๋ฌด 2022. 10. 12. 16:39
๋ฐ˜์‘ํ˜•

๐Ÿงฎ ORACLE์—์„œ ์Œ์ˆ˜๋ฅผ 0์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋‹ค ๋ณด๋ฉด ์Œ์ˆ˜๋ฅผ 0์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์ž์ฃผ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ๋งค์ถœ์ด ๋งˆ์ด๋„ˆ์Šค๋กœ ๊ธฐ๋ก๋˜๊ฑฐ๋‚˜, ์†์ต ๊ณ„์‚ฐ์—์„œ ์†์‹ค ๊ฐ’์„ 0์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿด ๋•Œ Oracle SQL์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์Œ์ˆ˜๋ฅผ 0์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋Œ€ํ‘œ์ ์œผ๋กœ GREATEST() ํ•จ์ˆ˜์™€ SIGN() ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.


๐ŸŸง 1๏ธโƒฃ GREATEST ํ•จ์ˆ˜ ์‚ฌ์šฉ

๐Ÿ“˜ ๊ธฐ๋ณธ ๊ฐœ๋…

GREATEST(expr1, expr2, ...) ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ ์ฆ‰, GREATEST(-999, 0) ์€ ๋‘ ๊ฐ’ ์ค‘ ํฐ ๊ฐ’์ธ 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงฉ ์˜ˆ์‹œ

SELECT GREATEST(-999, 0) AS result FROM DUAL;
์ž…๋ ฅ๊ฐ’ ๊ฒฐ๊ณผ
-999 0
50 50
0 0

โœ… ์žฅ์ 

  • ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ž„
  • ์—ฌ๋Ÿฌ ์—ด์„ ํ•œ ๋ฒˆ์— ๋น„๊ตํ•  ๋•Œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

โš™๏ธ ํ™•์žฅ ์˜ˆ์‹œ

SELECT 
    EMPNO,
    SAL,
    GREATEST(SAL, 0) AS NON_NEGATIVE_SAL
FROM EMP;

๐Ÿ‘‰ ๊ธ‰์—ฌ(SAL)๊ฐ€ ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ 0์œผ๋กœ,
์–‘์ˆ˜์ผ ๊ฒฝ์šฐ ๋ณธ๋ž˜ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.


๐ŸŸฉ 2๏ธโƒฃ SIGN + DECODE ์กฐํ•ฉ ์‚ฌ์šฉ

๐Ÿ“˜ SIGN ํ•จ์ˆ˜๋ž€?

SIGN(number) ํ•จ์ˆ˜๋Š” ์ˆซ์ž์˜ ๋ถ€ํ˜ธ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ๊ฐ’ ๋ฐ˜ํ™˜๊ฐ’ ์˜๋ฏธ
์–‘์ˆ˜ 1 Positive
0 0 Zero
์Œ์ˆ˜ -1 Negative

์ฆ‰,

SELECT SIGN(-999) FROM DUAL;  -- ๊ฒฐ๊ณผ: -1
SELECT SIGN(999)  FROM DUAL;  -- ๊ฒฐ๊ณผ:  1
SELECT SIGN(0)    FROM DUAL;  -- ๊ฒฐ๊ณผ:  0

๐Ÿ“˜ DECODE ํ•จ์ˆ˜๋ž€?

DECODE(expr, search, result, default)๋Š” ์กฐ๊ฑด ๋ถ„๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” Oracle ์ „์šฉ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

DECODE(SIGN(-999), -1, 0, -999)

์ด ์‹์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. SIGN(-999) โ†’ -1
  2. DECODE ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž(SIGN(-999))๊ฐ€ -1์ด๋ฉด 0์„ ๋ฐ˜ํ™˜,
    ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์›๋ž˜ ๊ฐ’(-999) ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ 0์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์›๋ž˜ ๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿงฉ ์˜ˆ์‹œ

SELECT DECODE(SIGN(-999), -1, 0, -999) AS result FROM DUAL;
์ž…๋ ฅ๊ฐ’ SIGN ๊ฒฐ๊ณผ ์ตœ์ข… ๊ฒฐ๊ณผ
-999 -1 0
50 1 50
0 0 0

โš–๏ธ 3๏ธโƒฃ ๋‘ ๋ฐฉ๋ฒ• ๋น„๊ต

๊ตฌ๋ถ„ GREATEST ๋ฐฉ์‹ SIGN + DECODE ๋ฐฉ์‹
๋ฌธ๋ฒ• ๊ฐ„๋‹จํ•จ ์•ฝ๊ฐ„ ๋ณต์žกํ•จ
๊ฐ€๋…์„ฑ ๋†’์Œ ์ค‘๊ฐ„
์‹คํ–‰ ์†๋„ ๊ฑฐ์˜ ๋™์ผ ๊ฑฐ์˜ ๋™์ผ
์ด์‹์„ฑ ANSI SQL๊ณผ ํ˜ธํ™˜ Oracle ์ „์šฉ
ํŠน์ง• ์—ฌ๋Ÿฌ ๊ฐ’ ๋น„๊ต ๊ฐ€๋Šฅ ๋…ผ๋ฆฌ ์ œ์–ด ๊ฐ€๋Šฅ

๐Ÿง  4๏ธโƒฃ ์ถ”๊ฐ€ ์˜ˆ์ œ: ๋Œ€๋Ÿ‰ ๋ณ€ํ™˜

์Œ์ˆ˜ ๊ฐ’์„ 0์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š” ์ปฌ๋Ÿผ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ๋Š” GREATEST๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค.

SELECT
    EMPNO,
    GREATEST(SAL, 0) AS SAL,
    GREATEST(COMM, 0) AS COMM,
    GREATEST(BONUS, 0) AS BONUS
FROM EMP;

๋ชจ๋“  ๊ธ‰์—ฌ ๊ด€๋ จ ํ•ญ๋ชฉ์—์„œ ์Œ์ˆ˜๋Š” ์ž๋™์œผ๋กœ 0์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.


๐Ÿงฉ 5๏ธโƒฃ CASE WHEN ๊ตฌ๋ฌธ์œผ๋กœ๋„ ๊ฐ€๋Šฅ

CASE ๋ฌธ์€ Oracle๋ฟ ์•„๋‹ˆ๋ผ ๋Œ€๋ถ€๋ถ„์˜ RDBMS์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด,
์ด์‹์„ฑ์ด ํ•„์š”ํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

SELECT 
    CASE 
        WHEN SAL < 0 THEN 0 
        ELSE SAL 
    END AS NON_NEGATIVE_SAL
FROM EMP;
์ž…๋ ฅ๊ฐ’ ๊ฒฐ๊ณผ
-500 0
1200 1200

๐Ÿ ์š”์•ฝ

๋ฐฉ๋ฒ• ์„ค๋ช… ํŠน์ง•
GREATEST(value, 0) ์Œ์ˆ˜ โ†’ 0 ๋ณ€ํ™˜, ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฆ„ ์ง๊ด€์ , ANSI SQL ํ˜ธํ™˜
DECODE(SIGN(value), -1, 0, value) Oracle ์ „์šฉ, ๋…ผ๋ฆฌ ๋ถ„๊ธฐ ๊ฐ€๋Šฅ ์œ ์—ฐํ•˜์ง€๋งŒ ๋ณต์žกํ•จ
CASE WHEN value < 0 THEN 0 ELSE value END ๋ชจ๋“  DB ๊ณตํ†ต ๋ฐฉ์‹ ์ด์‹์„ฑ ์ตœ๊ณ 

๐Ÿ’ก TIP:

  • GREATEST() ํ•จ์ˆ˜๋Š” NULL ๊ฐ’์ด ํฌํ•จ๋˜๋ฉด ๊ฒฐ๊ณผ๋„ NULL์ด ๋˜๋ฏ€๋กœ,
    ํ•„์š”ํ•˜๋‹ค๋ฉด NVL(value, 0)๋กœ ๊ฐ์‹ธ์„œ NULL์„ 0์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
SELECT GREATEST(NVL(value, 0), 0) FROM DUAL;

๐Ÿ“˜ ๊ฒฐ๋ก 

Oracle์—์„œ ์Œ์ˆ˜๋ฅผ 0์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€
GREATEST(value, 0)
ํ•˜์ง€๋งŒ DBMS ์ด์‹์„ฑ์„ ๊ณ ๋ คํ•œ๋‹ค๋ฉด
CASE WHEN value < 0 THEN 0 ELSE value END ๊ฐ€ ๊ฐ€์žฅ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.

๋Œ“๊ธ€